1 Introduction

In this RMarkdown file, the data-analysis for the manuscript “Multisystem inflammatory syndrome in children related to COVID-19: a systematic review” is described. The complete data-analysis can be reproduced from the data collection sheet (in .xls format), provided in the supplementary data.

knitr::opts_chunk$set(cache = FALSE, warning = FALSE, message = FALSE)
options(digits = 3)
library(tidyverse)
require(readxl)
require(httr)
require(reshape2)
require(broom)
require(RColorBrewer)
require(scales)
require(ggrepel)
require(gridExtra)
require(ggExtra)
library(ggbeeswarm)
require(ggpubr)
library(cowplot)
library(naniar)
require(DT)
require(zoo)
require(psych)
library(skimr)
library(UpSetR)
library(see)
library(wesanderson)

options(scipen=999)

co_hb <- 12
co_neutrophilia <- 8000
co_CRP <- 10
co_lympho <- 1250
co_fibrino <- 400
co_Ddim <- 250
co_ferritin <- 300
co_albu <- 34
co_PCT <- 0.49
co_LDH <- 280
co_IL6 <- 16.4
co_ESR <- 22
co_BNP <- 100
co_NTproBNP <- 400
co_tropo <- 40
co_WBC <- 11000
co_platelet <- 150000
co_sodium <- 135
#input = df_cohort_controls
#find = "max"
#param = "CRP"

collapse_labvals_cohort <- function(input, find, param){
  if (find == "max"){
    df <- input %>% select(contains(param) | contains("cohort_id") | contains("cohort_type") | contains("tot_cases_n"))
    print("Column extracted from cohorts:")
    print(colnames(df))
    df_med <- df %>% select(contains("med"))
    df_med <- type_convert(df_med)
    df_med <- df_med %>% mutate_all(funs(replace_na(., -999)))
   # colnames(df_med)[max.col(df_med,ties.method="first")]
    df_med <- df_med %>% mutate(med = as.numeric(apply(df_med, 1, max)))
    
    df_min <- df %>% select(contains("Q1"))
    df_min <- type_convert(df_min)
    df_min <- df_min %>% mutate_all(funs(replace_na(., 0)))
    #colnames(df_min)[max.col(df_min,ties.method="first")]
    df_min <- df_min %>% mutate(min = as.numeric(apply(df_min, 1, max)))
    
    df_max <- df %>% select(contains("Q3"))
    df_max <- type_convert(df_max)
    df_max <- df_max %>% mutate_all(funs(replace_na(., 0)))
    #colnames(df_max)[max.col(df_max,ties.method="first")]
    df_max <- df_max %>% mutate(max = as.numeric(apply(df_max, 1, max)))
    
    df_full <- cbind(df %>% select(cohort_id, cohort_type, tot_cases_n), df_med %>% select(med), df_min %>% select(min), df_max %>% select(max))
    df_full[df_full == -999] <- NA
    names(df_full)[names(df_full) == 'max'] <- paste0(param, "_max")
    names(df_full)[names(df_full) == 'min'] <- paste0(param, "_min")
    names(df_full)[names(df_full) == 'med'] <- paste0(param, "_med")
    df_full$data_descr <- "IQR"
    df_full$cohort_id <- paste0(df_full$cohort_id, " (n = ", as.character(df_full$tot_cases_n),")")
    write.csv(df_full, paste0("./data/cohort_", param, ".csv"))
    print(datatable(df_full, caption = paste0("overview of ", param)))
    return(df_full)
  }
    else if (find == "min"){
    df <- input %>% select(contains(param) | contains("cohort_id") | contains("cohort_type") | contains("tot_cases_n"))
    print("Column extracted from cohorts:")
    print(colnames(df))
    df_med <- df %>% select(contains("med"))
    df_med <- type_convert(df_med)
    df_med <- df_med %>% mutate_all(funs(replace_na(., 1e6)))
   # colnames(df_med)[max.col(df_med,ties.method="first")]
    df_med <- df_med %>% mutate(med = as.numeric(apply(df_med, 1, min)))
    
    df_min <- df %>% select(contains("Q1"))
    df_min <- type_convert(df_min)
    df_min <- df_min %>% mutate_all(funs(replace_na(., 1e6)))
    #colnames(df_min)[max.col(df_min,ties.method="first")]
    df_min <- df_min %>% mutate(min = as.numeric(apply(df_min, 1, min)))
    
    df_max <- df %>% select(contains("Q3"))
    df_max <- type_convert(df_max)
    df_max <- df_max %>% mutate_all(funs(replace_na(., 1e6)))
    #colnames(df_max)[max.col(df_max,ties.method="first")]
    df_max <- df_max %>% mutate(max = as.numeric(apply(df_max, 1, min)))
    
    df_full <- cbind(df %>% select(cohort_id, cohort_type, tot_cases_n), df_med %>% select(med), df_min %>% select(min), df_max %>% select(max))
    df_full[df_full == 1e6] <- NA
    names(df_full)[names(df_full) == 'max'] <- paste0(param, "_max")
    names(df_full)[names(df_full) == 'min'] <- paste0(param, "_min")
    names(df_full)[names(df_full) == 'med'] <- paste0(param, "_med")
    df_full$data_descr <- "IQR"
    df_full$cohort_id <- paste0(df_full$cohort_id, " (n = ", as.character(df_full$tot_cases_n),")")
    write.csv(df_full, paste0("./data/cohort_", param, ".csv"))
    print(datatable(df_full, caption = paste0("overview of ", param)))
    return(df_full)
  }
}

#input = df_singlecases
#find = "max"
#param = "CRP"

collapse_labvals_single <- function(input, find, param){
  if (find == "max"){
    df <- input %>% select(contains(param) | contains("cohort_id"))
    print("Column extracted from single cases:")
    print(colnames(df))
    df_coll <- df %>% mutate_all(funs(replace_na(., -999)))
    df_coll <- type_convert(df_coll)
   # colnames(df_med)[max.col(df_med,ties.method="first")]
    df_coll <- df_coll %>% mutate(max = as.numeric(apply(df_coll, 1, max)))
    
    df_coll[df_coll == -999] <- NA
    names(df_coll)[names(df_coll) == 'max'] <- paste0(param, "_max")
    df_coll$data_descr <- "IQR"
    df_coll$cohort_id <- paste0("single cases (n = ", as.character(n_single_cases),")")
    write.csv(skim(df_coll), paste0("./data/singlecases_", param, ".csv"))
    return(df_coll)
  }
    else if (find == "min"){
    df <- input %>% select(contains(param) | contains("cohort_id"))
    print("Column extracted from single cases:")
    print(colnames(df))
    df_coll <- df %>% mutate_all(funs(replace_na(., 1e6)))
   # colnames(df_med)[max.col(df_med,ties.method="first")]
    df_coll <- df_coll %>% mutate(min = as.numeric(apply(df_coll, 1, min)))
    
    df_coll[df_coll == 1e6] <- NA
    names(df_coll)[names(df_coll) == 'min'] <- paste0(param, "_min")
    df_coll$cohort_id <- paste0("single cases (n = ", as.character(n_single_cases),")")
    write.csv(skim(df_coll), paste0("./data/singlecases_", param, ".csv"))
    return(df_coll)
  }
}


moveme <- function (df, movecommand) {
  invec <- names(df)
  
  movecommand <- lapply(strsplit(strsplit(movecommand, ";")[[1]], 
                                 ",|\\s+"), function(x) x[x != ""])
  movelist <- lapply(movecommand, function(x) {
    Where <- x[which(x %in% c("before", "after", "first", 
                              "last")):length(x)]
    ToMove <- setdiff(x, Where)
    list(ToMove, Where)
  })
  myVec <- invec
  for (i in seq_along(movelist)) {
    temp <- setdiff(myVec, movelist[[i]][[1]])
    A <- movelist[[i]][[2]][1]
    if (A %in% c("before", "after")) {
      ba <- movelist[[i]][[2]][2]
      if (A == "before") {
        after <- match(ba, temp) - 1
      }
      else if (A == "after") {
        after <- match(ba, temp)
      }
    }
    else if (A == "first") {
      after <- 0
    }
    else if (A == "last") {
      after <- length(myVec)
    }
    myVec <- append(temp, values = movelist[[i]][[1]], after = after)
  }
  
  df[,match(myVec, names(df))]
}

makeBarplot <- function(var_id_cohort, var_id_single, var_id){

        n_cohort <- df_cohort %>% select(tot_cases_n) %>% sum()#, outcome_death_n)
        var_cohort <- df_cohort[var_id_cohort] %>% sum(., na.rm = TRUE)#, outcome_death_n)
        
        n_single <- df_singlecases %>% nrow()
        
        var_single <- df_singlecases %>% filter(get(var_id_single) == TRUE) %>% nrow()
        
        n_all <- n_cohort + n_single
        var_all <- var_cohort + var_single
        
        bar_df_abs <- data.frame(x = c("cohort", "cohort", "single cases", "single cases", "all", "all"), col = c("total", var_id, "total", var_id, "total", var_id), vals = c(n_cohort, var_cohort, n_single, var_single, n_all, var_all) )
        
        bar_df_prct <- data.frame(x = c("cohort", "cohort", "single cases", "single cases", "all", "all"), col = c(paste0(var_id, " -"), paste0(var_id, " +"), paste0(var_id, " -"), paste0(var_id, " +"), paste0(var_id, " -"), paste0(var_id, " +")), vals = c(100-(var_cohort/n_cohort*100), var_cohort/n_cohort*100, 100-(var_single/n_single*100), var_single/n_single*100, 100-(var_all/n_all*100), var_all/n_all*100) )

        
        p_abs <- ggplot(bar_df_abs, aes(x = x, y =  vals, fill = col)) +
            geom_bar(stat = "identity", position = "dodge") +
            theme_bw() + 
            labs(title = paste0("Total cases vs ", var_id), subtitle = "Absolute numbers", x = "group", y = "n", col = "") +
  scale_fill_manual(values = wes_palette("Royal1"))
        
        
        p_prct <- ggplot(bar_df_prct, aes(x = x, y =  vals, fill = col)) +
            geom_bar(stat = "identity", position = "fill") +
            theme_bw() + 
            labs(title = paste0(var_id), subtitle = "Percent", x = "group", y = "%", col = "")  +
    scale_y_continuous(labels = scales::percent)+
  scale_fill_manual(values = wes_palette("Royal1"))
        
        ggarrange(p_abs, p_prct, legend = "bottom")
  
}

makeHeatmap_cohort <- function(param1, colname_single, exclude_single = NULL, plottitle, textsize = 3){
  var_cohort <- df_cohort %>% select(("cohort_id") | "tot_cases_n" | ( contains(param1) & contains("_n")))
  var_cohort$cohort_id <- paste0(var_cohort$cohort_id, " (n = ", as.character(var_cohort$tot_cases_n),")")
  var_cohort <- var_cohort %>% 
    gather(variable, value, 3:ncol(var_cohort)) %>% group_by(cohort_id, variable) %>% summarize(prct = value/tot_cases_n*100)
  var_cohort$variable <- sub("_n", "", var_cohort$variable)

if (!is.null(exclude_single)){
  var_single <- df_singlecases %>% select(-contains(exclude_single))
  var_single <- var_single %>% select(contains(colname_single))
} else
{
  var_single <- df_singlecases %>% select(contains(colname_single))
}

 #%>% select(-contains("any"))
cols <- sapply(var_single, is.logical)
var_single[,cols] <- lapply(var_single[,cols], as.numeric)
var_single <- colSums(var_single, na.rm = TRUE)
var_single <- var_single/nrow(df_singlecases)*100
var_single <- as.data.frame(var_single) %>% rownames_to_column()
var_single$cohort_id <- "single_cases"
colnames(var_single) <- c("variable", "prct", "cohort_id")


missing <- setdiff(var_single$variable, var_cohort$variable)
if (length(missing) != 0 ){
  missing_df <- data.frame(variable = missing, prct = NA, cohort_id = unique(var_cohort$cohort_id))
  var_cohort <- bind_rows(var_cohort, as_tibble(missing_df))
} else if (length(missing) == 0) {
  missing <- setdiff(var_cohort$variable, var_single$variable)
  if (length(missing) != 0){
  missing_df <- data.frame(variable = missing, prct = NA, cohort_id = unique(var_single$cohort_id))
  var_single <- bind_rows(var_single, as_tibble(missing_df))
  }
}

hm_cohort <- ggplot(var_cohort, aes(x = variable, y = cohort_id, fill = prct)) + 
    geom_tile() + theme_classic() +
    theme(axis.text.x=element_blank(), axis.ticks.x=element_blank(), axis.line=element_blank())+
   scale_fill_gradient(low = "yellow", high="red", na.value = "lightgray", limits = c(0,100)) +
    labs(x = "", y = "cohort", title =plottitle) +
    geom_text(aes(label=round(prct, 2)), size = textsize, color = "black")

hm_single <- ggplot(var_single, aes(x = variable, y = cohort_id, fill = prct)) + 
    geom_tile() +  theme_classic() +
    theme(axis.text.x=element_text(angle=90, hjust=1), axis.line=element_blank())+
    scale_fill_gradient(low = "yellow", high = "red", na.value = "lightgray", limits = c(0,100))+ labs(y = "cohort") +
    geom_text(aes(label=round(prct, 2)), size = textsize, color = "black") 

plot_grid(hm_cohort, hm_single, align = "v", nrow = 2, rel_heights = c(1/2, 1/2))
}

2 Data import and cleaning

2.1 Single cases

First, we import the single cases from the general excel sheet and transform the excel sheet so that variables are columns and rows are cases. Columns without any values are also removed.

The single cases from Pouletty (10.1136/annrheumdis-2020-217960) are excluded (as they are included in the cohorts).

2.1.1 Making summary statistics

In this section, data is summarized. For example, if there are any comorbidities present, a column “comorb_any” is added and annotated as TRUE. The same is done for COVID serology and symptoms of major organ (respiratory, cardiovascular etc).

If IgG, IgA, IgM or COVID serology is reported as positive, the column covid_sero_any is annotated as TRUE.

If PCR+, stool PCR+, IgG, IgA, IgM or COVID serology is reported as positive, the column covid_pos_any is annotated as TRUE.

If any respiratory symptoms, symp_resp_any is annotated as TRUE.

If any GI symptoms, symp_GI_any is annotated as TRUE.

If any neurological symptoms, symp_neuro_any is annotated as TRUE.

If any renal symptoms, symp_renal_any is annotated as TRUE.

If any cardiovascular symptoms, symp_cardiovasc_any is annotated as TRUE.

2.2 Cohorts

Afterwards, we do the same for the cohort sheet.

The papers by Grimaud et al. and Verdoni et al. are removed from the cohort dataframe, as most information is present in the single cases dataframe.

3 Descriptive statistics

3.1 General

Click on the any of the tabs above to see descriptive statistics for every variable

3.2 Single cases

How to read
Under “Variable type: logical”, the number of true/falses are depicted. E.g. at the top we can see that there are 95 number of rows (= 95 patients). Overweight has 79 missing values (17% is complete), which means that 95-79=16 patients have either “TRUE” or “FALSE” for overweight. Of these 16, 9 are marked as “TRUE” for overweight.

Download data as .csv on Github

Data summary
Name df_singlecases
Number of rows 95
Number of columns 156
_______________________
Column type frequency:
character 12
logical 90
numeric 54
________________________
Group variables None

Variable type: character

skim_variable n_missing complete_rate min max empty n_unique whitespace
doi 0 1.00 28 50 0 28 0
first_author 0 1.00 10 25 0 28 0
journal 0 1.00 6 62 0 22 0
prim_input 0 1.00 2 2 0 1 0
cross_check 6 0.94 3 20 0 2 0
patientID_pub 16 0.83 6 10 0 24 0
patientID_int 0 1.00 9 10 0 95 0
notes 91 0.04 12 66 0 4 0
sex 0 1.00 1 1 0 2 0
ethnicity 61 0.36 5 26 0 8 0
symp_fever_days 52 0.45 1 3 0 13 0
symp_cardiovasc_LVEF 40 0.58 2 3 0 25 0

Variable type: logical

skim_variable n_missing complete_rate mean count
overweight 58 0.39 0.35 FAL: 24, TRU: 13
comorb_any 79 0.17 1.00 TRU: 16
comorb_cardiovasc 70 0.26 0.04 FAL: 24, TRU: 1
comorb_resp 75 0.21 0.00 FAL: 20
comorb_resp_astma 87 0.08 1.00 TRU: 8
comorb_resp_hay 94 0.01 1.00 TRU: 1
comorb_diabetes 75 0.21 0.00 FAL: 20
comorb_renal 75 0.21 0.00 FAL: 20
comorb_malignancy 75 0.21 0.00 FAL: 20
comorb_immunodef 75 0.21 0.00 FAL: 20
comorb_CAH 94 0.01 1.00 TRU: 1
comorb_hypothyr 93 0.02 1.00 TRU: 2
comorb_alopecia 94 0.01 1.00 TRU: 1
comorb_crohn 94 0.01 1.00 TRU: 1
comorb_PFAPA 94 0.01 1.00 TRU: 1
comorb_NAFLD 94 0.01 1.00 TRU: 1
comorb_SBS 94 0.01 1.00 TRU: 1
covid_closecontact 69 0.27 0.58 TRU: 15, FAL: 11
covid_PCR_pos 3 0.97 0.42 FAL: 53, TRU: 39
covid_PCR_stool_pos 79 0.17 0.12 FAL: 14, TRU: 2
covid_pos_any 13 0.86 1.00 TRU: 82
covid_sero_any 33 0.65 1.00 TRU: 62
covid_sero_pos 80 0.16 1.00 TRU: 15
covid_IgA_pos 77 0.19 1.00 TRU: 18
covid_IgM_pos 78 0.18 0.41 FAL: 10, TRU: 7
covid_IgG_pos 45 0.53 0.94 TRU: 47, FAL: 3
symp_fever 0 1.00 1.00 TRU: 95
symp_resp_any 50 0.47 1.00 TRU: 45
symp_resp_NS 82 0.14 0.69 TRU: 9, FAL: 4
symp_resp_URT 80 0.16 0.73 TRU: 11, FAL: 4
symp_resp_dyspnea 66 0.31 0.76 TRU: 22, FAL: 7
symp_resp_pneumonia 48 0.49 0.70 TRU: 33, FAL: 14
symp_resp_failure 66 0.31 0.66 TRU: 19, FAL: 10
symp_resp_chestpain 88 0.07 0.29 FAL: 5, TRU: 2
symp_GI_any 15 0.84 1.00 TRU: 80
symp_GI_NS 85 0.11 1.00 TRU: 10
symp_GI_abdopain 28 0.71 0.97 TRU: 65, FAL: 2
symp_GI_vomiting 39 0.59 0.95 TRU: 53, FAL: 3
symp_GI_diarrh 45 0.53 0.84 TRU: 42, FAL: 8
symp_GI_colitis 91 0.04 1.00 TRU: 4
symp_neuro_any 68 0.28 1.00 TRU: 27
symp_neuro_headache 78 0.18 0.65 TRU: 11, FAL: 6
symp_neuro_meningitis 94 0.01 1.00 TRU: 1
symp_neuro_meningism 81 0.15 0.43 FAL: 8, TRU: 6
symp_neuro_asthenia 88 0.07 1.00 TRU: 7
symp_neuro_irritab 85 0.11 0.60 TRU: 6, FAL: 4
symp_dermato_NS 93 0.02 1.00 TRU: 2
symp_renal_any 80 0.16 0.87 TRU: 13, FAL: 2
symp_renal_AKI 80 0.16 0.87 TRU: 13, FAL: 2
symp_cardiovasc_any 8 0.92 1.00 TRU: 87
symp_cardiovasc_myocard 62 0.35 1.00 TRU: 33
symp_cardiovasc_pericard 59 0.38 0.61 TRU: 22, FAL: 14
symp_cardiovasc_cordilat 40 0.58 0.18 FAL: 45, TRU: 10
symp_cardiovasc_aneurysm 61 0.36 0.15 FAL: 29, TRU: 5
symp_cardiovasc_LV_30to55 38 0.60 0.47 FAL: 30, TRU: 27
symp_cardiovasc_LV_less30 68 0.28 0.22 FAL: 21, TRU: 6
symp_cardiovasc_shock 9 0.91 0.93 TRU: 80, FAL: 6
symp_cardiovasc_tachycard 26 0.73 1.00 TRU: 69
symp_cardiovasc_arrhyt 93 0.02 1.00 TRU: 2
kawasaki_complete 44 0.54 0.29 FAL: 36, TRU: 15
kawasaki_incomplete 42 0.56 0.45 FAL: 29, TRU: 24
kawasaki_fever 18 0.81 0.87 TRU: 67, FAL: 10
kawasaki_exanthema 28 0.71 0.69 TRU: 46, FAL: 21
kawasaki_extremity 68 0.28 0.74 TRU: 20, FAL: 7
kawasaki_mouth 50 0.47 0.53 TRU: 24, FAL: 21
kawasaki_cervical 53 0.44 0.24 FAL: 32, TRU: 10
kawasaki_conjunctivitis 32 0.66 0.67 TRU: 42, FAL: 21
symp_MAS 85 0.11 0.60 TRU: 6, FAL: 4
symp_effusion 76 0.20 0.68 TRU: 13, FAL: 6
admis_PICU_admis 52 0.45 0.98 TRU: 42, FAL: 1
critcare_NIV 39 0.59 0.61 TRU: 34, FAL: 22
critcare_MV 42 0.56 0.51 TRU: 27, FAL: 26
critcare_inotrop 18 0.81 0.79 TRU: 61, FAL: 16
critcare_ECMO 61 0.36 0.09 FAL: 31, TRU: 3
critcare_RRT 93 0.02 1.00 TRU: 2
rx_cortic 32 0.66 0.56 TRU: 35, FAL: 28
rx_aspirin_low 68 0.28 0.78 TRU: 21, FAL: 6
rx_aspirin_high 75 0.21 0.90 TRU: 18, FAL: 2
rx_aspirin_NS 88 0.07 0.71 TRU: 5, FAL: 2
rx_heparin 73 0.23 1.00 TRU: 22
rx_IVIg_once 17 0.82 0.96 TRU: 75, FAL: 3
rx_IVIg_multip 84 0.12 0.36 FAL: 7, TRU: 4
rx_anakinra 90 0.05 1.00 TRU: 5
rx_tocilizumab 75 0.21 1.00 TRU: 20
rx_infliximab 93 0.02 1.00 TRU: 2
rx_antibiotics 45 0.53 1.00 TRU: 50
rx_plasma 94 0.01 1.00 TRU: 1
rx_remdesivir 90 0.05 0.80 TRU: 4, FAL: 1
outcome_death 37 0.61 0.03 FAL: 56, TRU: 2
outcome_LVdysf 86 0.09 0.00 FAL: 9

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
date_of_publication 0 1.00 43987.13 12.83 43952.00 43979.00 43983.00 43998.50 44011.00 ▁▅▇▅▆
age 0 1.00 9.40 4.41 0.33 6.00 9.00 12.30 20.00 ▂▇▇▅▂
weight 71 0.25 46.77 26.61 5.60 25.00 44.50 64.50 105.00 ▇▇▇▅▂
BMI 60 0.37 21.59 6.40 12.00 16.50 20.00 25.45 36.70 ▆▇▆▂▃
symp_neuro_GCS 74 0.22 13.57 2.68 4.00 13.00 15.00 15.00 15.00 ▁▁▁▂▇
kawasaki_koyobashi 85 0.11 5.10 1.52 2.00 4.50 6.00 6.00 6.00 ▁▁▁▁▇
lab_Hb_lowest 77 0.19 10.39 1.94 7.00 8.67 10.95 11.75 13.10 ▅▂▁▇▅
lab_WBC_highest 70 0.26 18418.40 10027.21 2900.00 11800.00 15800.00 23110.00 40000.00 ▂▇▂▂▂
lab_lymphocytes_lowest 34 0.64 1082.43 1106.15 170.00 510.00 860.00 1150.00 7200.00 ▇▁▁▁▁
lab_neutrophils 61 0.36 14846.53 8563.92 1500.00 9392.50 11640.00 18780.50 36200.00 ▃▇▃▁▂
lab_platelets_NS 21 0.78 189500.00 94223.90 42000.00 121500.00 170000.00 234750.00 516000.00 ▆▇▃▁▁
lab_platelets_highest 89 0.06 583666.67 289892.85 250000.00 431500.00 551500.00 631000.00 1100000.00 ▇▃▇▁▃
lab_platelets_lowest 90 0.05 180600.00 90762.33 100000.00 111000.00 136000.00 260000.00 296000.00 ▇▁▁▁▅
lab_sodium 47 0.51 130.00 4.23 118.00 128.00 130.00 133.00 139.00 ▂▂▇▇▃
lab_ferritin_NS 59 0.38 1257.34 1196.76 199.00 535.00 906.50 1285.75 5440.00 ▇▂▁▁▁
lab_ferritin_admis 74 0.22 1843.70 2542.46 264.00 446.00 1089.00 1789.00 10170.00 ▇▁▁▁▁
lab_ferritin_peak 84 0.12 1348.12 1130.04 375.80 776.15 1096.20 1346.50 4488.00 ▇▃▁▁▁
lab_Ddim_NS 55 0.42 6124.88 5689.73 320.00 2230.00 3975.00 9155.00 24500.00 ▇▂▂▁▁
lab_Ddim_peak 86 0.09 8072.78 9005.15 508.00 2150.00 3300.00 11510.00 27760.00 ▇▂▃▁▂
lab_lactate 75 0.21 3.60 2.20 1.00 1.70 3.20 5.25 8.10 ▇▃▂▂▂
lab_fibrino 47 0.51 707.08 286.24 179.00 537.75 710.00 810.00 2140.00 ▃▇▁▁▁
lab_triglyc 83 0.13 348.00 275.10 121.00 186.00 231.50 383.75 987.00 ▇▂▁▁▁
lab_albumin_admis 40 0.58 26.17 7.11 17.30 20.75 24.00 31.50 43.00 ▇▅▂▂▂
lab_albumin_lowest 88 0.07 24.00 2.52 21.00 22.00 24.00 25.50 28.00 ▇▁▅▂▂
lab_albumin_NS 91 0.04 22.25 4.19 18.00 20.25 21.50 23.50 28.00 ▃▇▁▁▃
lab_creat 94 0.01 2.65 NA 2.65 2.65 2.65 2.65 2.65 ▁▁▇▁▁
lab_AST 75 0.21 90.15 64.00 28.00 47.00 70.00 103.50 239.00 ▇▃▂▁▂
lab_ALT_peak 49 0.48 71.17 110.14 6.00 23.25 48.00 78.75 733.00 ▇▁▁▁▁
lab_ALT_NS 90 0.05 71.20 11.56 52.00 69.00 76.00 79.00 80.00 ▂▁▁▂▇
lab_CK 84 0.12 81.36 61.96 16.00 43.00 76.00 86.50 247.00 ▇▆▂▁▂
lab_LDH 76 0.20 541.89 279.64 283.00 307.00 408.00 761.00 1059.00 ▇▁▂▂▂
lab_troponin_admis 26 0.73 991.29 3442.01 0.00 47.00 140.00 470.00 27360.00 ▇▁▁▁▁
lab_troponin_max 73 0.23 993.83 1564.33 4.00 132.00 387.00 932.90 6170.00 ▇▂▁▁▁
lab_NTproBNP 71 0.25 8518.34 11115.95 72.44 782.00 2514.50 13273.25 35000.00 ▇▂▁▁▁
lab_BNP_admis 57 0.40 4329.53 5458.54 0.00 408.50 2265.00 5847.50 19013.00 ▇▁▁▁▁
lab_BNP_max 84 0.12 3689.04 5271.04 517.70 957.80 1718.60 3177.00 18606.50 ▇▁▁▁▁
lab_CRP_admis 16 0.83 254.03 116.23 9.00 168.00 249.90 318.00 556.00 ▂▇▇▂▂
lab_CRP_NS 84 0.12 287.04 131.78 7.40 227.50 328.00 369.50 456.00 ▂▂▃▇▆
lab_CRP_peak 82 0.14 277.29 93.91 164.00 191.00 250.00 357.00 425.00 ▇▃▂▅▃
lab_PCT_admis 40 0.58 46.54 88.86 0.11 5.78 15.20 41.39 448.00 ▇▁▁▁▁
lab_PCT_peak 84 0.12 48.11 57.08 2.45 15.12 28.40 56.37 200.00 ▇▂▁▁▁
lab_PCT_NS 88 0.07 31.51 39.75 0.13 3.50 14.80 49.30 100.00 ▇▂▁▂▂
lab_ESR 75 0.21 70.20 26.66 11.00 55.50 65.00 86.00 118.00 ▁▂▇▂▃
lab_IL6 69 0.27 278.33 278.76 11.60 109.30 235.00 335.00 1449.00 ▇▃▁▁▁
lab_IL8 75 0.21 53.59 41.98 9.40 27.25 41.40 54.42 149.00 ▇▇▁▁▃
lab_TNF 75 0.21 40.52 21.99 10.70 23.08 37.25 52.92 97.80 ▇▂▅▂▁
lab_IL1 75 0.21 0.62 0.51 0.00 0.30 0.40 0.90 1.60 ▇▇▃▁▃
lab_IL2 94 0.01 3157.00 NA 3157.00 3157.00 3157.00 3157.00 3157.00 ▁▁▇▁▁
admis_hosp_days 68 0.28 9.19 3.62 2.00 7.00 8.00 12.00 17.00 ▂▇▃▅▂
admis_ICU_days 71 0.25 5.25 2.94 0.00 3.75 4.00 8.00 11.00 ▂▇▂▅▂
lab_PELOD2 75 0.21 12.50 4.39 10.00 10.00 10.50 11.00 22.00 ▇▁▁▁▂
critcare_NIV_days 93 0.02 3.00 2.83 1.00 2.00 3.00 4.00 5.00 ▇▁▁▁▇
critcare_MV_days 93 0.02 4.50 0.71 4.00 4.25 4.50 4.75 5.00 ▇▁▁▁▇
critcare_inotrop_days 91 0.04 4.38 3.90 1.50 1.88 3.00 5.50 10.00 ▇▃▁▁▃

3.3 Cohorts

How to read
The sum column equals the sum of all individuals, e.g. sum(tot_cases_n) means that there are 592 patients in total in the cohorts; sum(outcome_death_n) means that 9 patients died.

The “Prct_total” column is the percentage of e.g. death (9/592). Only makes sense where n is reported e.g. therapy (not for lab values).

Data summary
Name df_cohort
Number of rows 15
Number of columns 341
_______________________
Column type frequency:
character 8
numeric 333
________________________
Group variables None

Variable type: character

skim_variable n_missing complete_rate min max empty n_unique whitespace
doi 0 1.0 21 49 0 12 0
first_author 0 1.0 13 19 0 12 0
journal 0 1.0 3 16 0 9 0
cohort_id 0 1.0 6 20 0 15 0
cohort_type 0 1.0 5 5 0 1 0
prim_input 0 1.0 2 2 0 1 0
cross_check 0 1.0 3 3 0 1 0
notes 6 0.6 4 51 0 9 0

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist sum Prct_total
date_of_publication 0 1.00 43995.80 12.66 43968.0 43990.00 43994.00 44009.00 44011.0 ▂▃▆▅▇ 659937.0 111475.84
tot_cases_n 0 1.00 39.47 42.80 7.0 19.00 33.00 38.50 186.0 ▇▁▁▁▁ 592.0 100.00
sex_m 0 1.00 23.13 26.91 4.0 10.00 18.00 20.00 115.0 ▇▁▁▁▁ 347.0 58.61
sex_f 0 1.00 16.33 16.47 3.0 8.50 12.00 18.50 71.0 ▇▃▁▁▁ 245.0 41.39
age_med_yrs 3 0.80 8.82 1.82 5.0 7.97 8.70 10.00 12.0 ▁▁▇▂▂ 105.9 17.89
age_Q1_yrs 8 0.47 5.49 2.39 2.0 4.40 5.70 6.20 9.5 ▃▁▇▁▂ 38.4 6.49
age_Q3_yrs 8 0.47 12.69 1.79 10.0 11.85 12.60 13.50 15.5 ▂▂▇▂▂ 88.8 15.00
age_min_yrs 10 0.33 1.66 1.44 0.0 0.60 1.80 2.20 3.7 ▇▁▇▁▃ 8.3 1.40
age_max_yrs 10 0.33 17.92 1.93 16.0 16.60 17.00 20.00 20.0 ▇▃▁▁▇ 89.6 15.14
age_n_under1 13 0.13 6.50 9.19 0.0 3.25 6.50 9.75 13.0 ▇▁▁▁▇ 13.0 2.20
age_n_1to4 14 0.07 53.00 NA 53.0 53.00 53.00 53.00 53.0 ▁▁▇▁▁ 53.0 8.95
age_n_1to5 14 0.07 1.00 NA 1.0 1.00 1.00 1.00 1.0 ▁▁▇▁▁ 1.0 0.17
age_n_5to9 14 0.07 46.00 NA 46.0 46.00 46.00 46.00 46.0 ▁▁▇▁▁ 46.0 7.77
age_n_6to10 14 0.07 15.00 NA 15.0 15.00 15.00 15.00 15.0 ▁▁▇▁▁ 15.0 2.53
age_n_10to14 14 0.07 45.00 NA 45.0 45.00 45.00 45.00 45.0 ▁▁▇▁▁ 45.0 7.60
age_n_11to16 14 0.07 19.00 NA 19.0 19.00 19.00 19.00 19.0 ▁▁▇▁▁ 19.0 3.21
age_n_0to5 13 0.13 17.50 19.09 4.0 10.75 17.50 24.25 31.0 ▇▁▁▁▇ 35.0 5.91
age_n_6to12 14 0.07 42.00 NA 42.0 42.00 42.00 42.00 42.0 ▁▁▇▁▁ 42.0 7.09
age_n_13to20 13 0.13 35.50 13.44 26.0 30.75 35.50 40.25 45.0 ▇▁▁▁▇ 71.0 11.99
age_n_15to20 14 0.07 29.00 NA 29.0 29.00 29.00 29.00 29.0 ▁▁▇▁▁ 29.0 4.90
race_n_white 4 0.73 11.82 9.16 0.0 7.50 12.00 12.50 35.0 ▃▇▁▁▁ 130.0 21.96
race_n_black 4 0.73 14.82 12.15 4.0 7.00 12.00 17.50 46.0 ▇▂▂▁▁ 163.0 27.53
race_n_asian 6 0.60 4.11 5.51 0.0 1.00 2.00 4.00 18.0 ▇▂▁▁▁ 37.0 6.25
race_n_other 5 0.67 7.60 7.66 1.0 3.00 5.00 8.50 26.0 ▇▂▁▁▁ 76.0 12.84
race_n_unknown 13 0.13 22.50 26.16 4.0 13.25 22.50 31.75 41.0 ▇▁▁▁▇ 45.0 7.60
ethn_n_hisp 13 0.13 33.00 33.94 9.0 21.00 33.00 45.00 57.0 ▇▁▁▁▇ 66.0 11.15
eth_n_nonhisp 14 0.07 24.00 NA 24.0 24.00 24.00 24.00 24.0 ▁▁▇▁▁ 24.0 4.05
weight_med_kg 14 0.07 33.40 NA 33.4 33.40 33.40 33.40 33.4 ▁▁▇▁▁ 33.4 5.64
bmi_med 13 0.13 18.02 0.83 17.4 17.72 18.02 18.31 18.6 ▇▁▁▁▇ 36.0 6.09
bmi_Q1 14 0.07 15.90 NA 15.9 15.90 15.90 15.90 15.9 ▁▁▇▁▁ 15.9 2.69
bmi_Q3 14 0.07 22.90 NA 22.9 22.90 22.90 22.90 22.9 ▁▁▇▁▁ 22.9 3.87
n_overweight 5 0.67 11.90 12.47 2.0 6.00 9.00 12.50 45.0 ▇▃▁▁▁ 119.0 20.10
comorb_n_cardiovasc 12 0.20 2.33 2.52 0.0 1.00 2.00 3.50 5.0 ▇▇▁▁▇ 7.0 1.18
comorb_n_resp 14 0.07 33.00 NA 33.0 33.00 33.00 33.00 33.0 ▁▁▇▁▁ 33.0 5.57
comorb_n_astma 8 0.47 3.00 1.73 0.0 2.50 3.00 4.00 5.0 ▂▂▇▁▅ 21.0 3.55
comorb_n_chronlungdz 12 0.20 4.67 2.52 2.0 3.50 5.00 6.00 7.0 ▇▁▇▁▇ 14.0 2.36
comorb_n_immunodef 14 0.07 10.00 NA 10.0 10.00 10.00 10.00 10.0 ▁▁▇▁▁ 10.0 1.69
comorb_n_NS 14 0.07 3.00 NA 3.0 3.00 3.00 3.00 3.0 ▁▁▇▁▁ 3.0 0.51
comorb_n_lupus 14 0.07 1.00 NA 1.0 1.00 1.00 1.00 1.0 ▁▁▇▁▁ 1.0 0.17
comorb_n_neurodis 14 0.07 1.00 NA 1.0 1.00 1.00 1.00 1.0 ▁▁▇▁▁ 1.0 0.17
comorb_n_sickle 14 0.07 1.00 NA 1.0 1.00 1.00 1.00 1.0 ▁▁▇▁▁ 1.0 0.17
comorb_n_alopecia 14 0.07 1.00 NA 1.0 1.00 1.00 1.00 1.0 ▁▁▇▁▁ 1.0 0.17
covid_n_closecontact 7 0.53 14.00 16.87 3.0 6.00 9.00 11.50 55.0 ▇▁▁▁▁ 112.0 18.92
covid_n_PCR_pos 0 1.00 14.20 17.15 1.0 6.50 11.00 15.00 73.0 ▇▁▁▁▁ 213.0 35.98
covid_n_PCR_neg 2 0.87 25.69 27.29 2.0 10.00 22.00 25.00 108.0 ▇▃▁▁▁ 334.0 56.42
covid_n_PCR_stool_pos 10 0.33 0.80 0.84 0.0 0.00 1.00 1.00 2.0 ▇▁▇▁▃ 4.0 0.68
covid_n_PCR_stool_neg 10 0.33 10.60 13.28 0.0 3.00 5.00 12.00 33.0 ▇▂▁▁▂ 53.0 8.95
covid_n_sero_pos 10 0.33 32.80 30.66 9.0 12.00 27.00 31.00 85.0 ▇▇▁▁▃ 164.0 27.70
covid_n_sero_neg 10 0.33 11.80 19.42 0.0 0.00 5.00 8.00 46.0 ▇▁▁▁▂ 59.0 9.97
covid_n_sero_any 14 0.07 30.00 NA 30.0 30.00 30.00 30.00 30.0 ▁▁▇▁▁ 30.0 5.07
covid_n_IgA_pos 14 0.07 25.00 NA 25.0 25.00 25.00 25.00 25.0 ▁▁▇▁▁ 25.0 4.22
covid_n_IgA_neg 14 0.07 10.00 NA 10.0 10.00 10.00 10.00 10.0 ▁▁▇▁▁ 10.0 1.69
covid_n_IgM_pos 13 0.13 12.50 14.85 2.0 7.25 12.50 17.75 23.0 ▇▁▁▁▇ 25.0 4.22
covid_n_IgM_neg 13 0.13 30.00 4.24 27.0 28.50 30.00 31.50 33.0 ▇▁▁▁▇ 60.0 10.14
covid_n_IgG_pos 5 0.67 22.50 11.83 3.0 19.00 24.50 29.50 40.0 ▃▁▇▃▃ 225.0 38.01
covid_n_IgG_neg 5 0.67 4.30 8.38 0.0 0.00 1.00 4.75 27.0 ▇▂▁▁▁ 43.0 7.26
symp_fever_n 1 0.93 40.50 44.15 7.0 19.25 32.00 40.25 186.0 ▇▂▁▁▁ 567.0 95.78
symp_fever_days_min 13 0.13 2.00 1.41 1.0 1.50 2.00 2.50 3.0 ▇▁▁▁▇ 4.0 0.68
symp_fever_days_med 10 0.33 6.60 1.82 5.0 5.00 6.00 8.00 9.0 ▇▃▁▃▃ 33.0 5.57
symp_fever_days_max 13 0.13 15.50 4.95 12.0 13.75 15.50 17.25 19.0 ▇▁▁▁▇ 31.0 5.24
symp_fever_days_Q1 12 0.20 7.33 2.08 5.0 6.50 8.00 8.50 9.0 ▇▁▁▇▇ 22.0 3.72
symp_fever_days_Q3 12 0.20 10.67 2.31 8.0 10.00 12.00 12.00 12.0 ▃▁▁▁▇ 32.0 5.41
symp_resp_any_n 7 0.53 25.38 43.33 1.0 5.50 11.50 18.50 131.0 ▇▁▁▁▁ 203.0 34.29
symp_resp_URT_n 10 0.33 9.60 3.91 6.0 6.00 9.00 12.00 15.0 ▇▃▁▃▃ 48.0 8.11
symp_resp_dyspnea_n 10 0.33 10.60 7.30 5.0 6.00 8.00 11.00 23.0 ▇▂▁▁▂ 53.0 8.95
symp_resp_pneumonia_n 11 0.27 10.25 4.99 3.0 9.00 12.00 13.25 14.0 ▃▁▁▃▇ 41.0 6.93
symp_resp_chestpain_n 11 0.27 4.25 2.75 1.0 2.50 4.50 6.25 7.0 ▃▃▁▁▇ 17.0 2.87
symp_resp_failure_n 9 0.40 22.17 42.99 0.0 1.50 3.00 13.50 109.0 ▇▁▁▁▂ 133.0 22.47
symp_GI_any_n 2 0.87 33.85 42.42 6.0 15.00 23.00 32.00 171.0 ▇▁▁▁▁ 440.0 74.32
symp_GI_abdopain_n 9 0.40 24.17 8.01 13.0 18.75 25.00 30.50 33.0 ▃▇▁▃▇ 145.0 24.49
symp_GI_vomiting_n 8 0.47 21.57 4.28 16.0 18.00 23.00 25.00 26.0 ▅▂▁▂▇ 151.0 25.51
symp_GI_diarrh_n 8 0.47 19.00 6.06 13.0 14.50 18.00 21.50 30.0 ▇▂▅▁▂ 133.0 22.47
symp_GI_colitis_n 14 0.07 3.00 NA 3.0 3.00 3.00 3.00 3.0 ▁▁▇▁▁ 3.0 0.51
symp_neuro_any_n 4 0.73 9.64 5.16 4.0 4.50 10.00 12.50 19.0 ▇▃▆▂▂ 106.0 17.91
symp_neuro_encefalo_n 14 0.07 4.00 NA 4.0 4.00 4.00 4.00 4.0 ▁▁▇▁▁ 4.0 0.68
symp_neuro_asthenia_n 10 0.33 8.20 15.06 0.0 1.00 1.00 4.00 35.0 ▇▁▁▁▂ 41.0 6.93
symp_neuro_headache_n 11 0.27 11.00 5.23 4.0 8.50 12.50 15.00 15.0 ▃▁▃▁▇ 44.0 7.43
symp_neuro_irritab_n 14 0.07 12.00 NA 12.0 12.00 12.00 12.00 12.0 ▁▁▇▁▁ 12.0 2.03
symp_dermato_any_n 12 0.20 20.33 7.23 12.0 18.00 24.00 24.50 25.0 ▃▁▁▁▇ 61.0 10.30
symp_renal_any_n 14 0.07 15.00 NA 15.0 15.00 15.00 15.00 15.0 ▁▁▇▁▁ 15.0 2.53
symp_renal_AKI_n 8 0.47 9.00 7.23 3.0 3.50 7.00 11.50 23.0 ▇▂▂▁▂ 63.0 10.64
symp_cardiovasc_any_n 13 0.13 85.50 89.80 22.0 53.75 85.50 117.25 149.0 ▇▁▁▁▇ 171.0 28.89
symp_cardiovasc_myocard_n 8 0.47 12.86 7.15 1.0 9.00 15.00 17.50 21.0 ▃▃▃▇▇ 90.0 15.20
symp_cardiovasc_pericard_n 7 0.53 9.25 8.14 1.0 3.00 8.00 11.25 26.0 ▇▇▂▁▂ 74.0 12.50
symp_cardiovasc_cordilat_n 5 0.67 5.20 4.29 0.0 2.25 5.50 6.00 15.0 ▇▇▂▁▂ 52.0 8.78
symp_cardiovasc_aneurysm_n 6 0.60 2.67 2.74 0.0 1.00 1.00 4.00 8.0 ▇▁▃▂▂ 24.0 4.05
symp_cardiovasc_LV_less30_n 8 0.47 3.71 4.19 0.0 0.50 2.00 6.50 10.0 ▇▂▁▁▃ 26.0 4.39
symp_cardiovasc_LV_30to55_n 9 0.40 23.67 19.17 9.0 12.50 18.00 23.50 61.0 ▇▂▁▁▂ 142.0 23.99
symp_cardiovasc_LVEF_med 10 0.33 44.72 6.95 34.0 42.00 46.60 50.00 51.0 ▃▁▃▃▇ 223.6 37.77
symp_cardiovasc_LVEF_Q1 14 0.07 39.50 NA 39.5 39.50 39.50 39.50 39.5 ▁▁▇▁▁ 39.5 6.67
symp_cardiovasc_LVEF_Q3 14 0.07 52.80 NA 52.8 52.80 52.80 52.80 52.8 ▁▁▇▁▁ 52.8 8.92
symp_cardiovasc_LVEF_min 13 0.13 6.50 4.95 3.0 4.75 6.50 8.25 10.0 ▇▁▁▁▇ 13.0 2.20
symp_cardiovasc_LVEF_max 13 0.13 50.00 9.90 43.0 46.50 50.00 53.50 57.0 ▇▁▁▁▇ 100.0 16.89
symp_cardiovasc_shock_n 2 0.87 14.62 10.06 1.0 5.00 13.00 22.00 29.0 ▇▃▂▆▆ 190.0 32.09
symp_cardiovasc_tachycard_n 10 0.33 21.40 15.81 4.0 7.00 26.00 28.00 42.0 ▇▁▃▃▃ 107.0 18.07
symp_cardiovasc_arrhyt_n 11 0.27 7.50 9.75 1.0 2.50 3.50 8.50 22.0 ▇▁▁▁▂ 30.0 5.07
symp_cardiovasc_thrombo_n 13 0.13 0.00 0.00 0.0 0.00 0.00 0.00 0.0 ▁▁▇▁▁ 0.0 0.00
kawasaki_complete_n 7 0.53 11.88 12.21 0.0 5.50 7.50 13.50 38.0 ▇▃▂▁▂ 95.0 16.05
kawasaki_incomplete_n 11 0.27 14.75 14.31 5.0 7.25 9.00 16.50 36.0 ▇▁▁▁▂ 59.0 9.97
kawasaki_comp_or_incomp_n 11 0.27 27.50 31.67 3.0 12.00 16.50 32.00 74.0 ▇▃▁▁▃ 110.0 18.58
kawasaki_fever_n 11 0.27 45.50 58.41 7.0 8.50 22.00 59.00 131.0 ▇▃▁▁▃ 182.0 30.74
kawasaki_exanthema_n 2 0.87 24.46 26.94 6.0 12.00 16.00 25.00 110.0 ▇▂▁▁▁ 318.0 53.72
kawasaki_mouth_n 3 0.80 17.50 19.95 4.0 7.75 12.00 17.50 78.0 ▇▂▁▁▁ 210.0 35.47
kawasaki_extremity_n 6 0.60 12.33 21.46 1.0 3.00 6.00 9.00 69.0 ▇▁▁▁▁ 111.0 18.75
kawasaki_cervical_n 5 0.67 7.80 7.11 0.0 3.00 5.00 11.25 21.0 ▇▂▃▁▃ 78.0 13.18
kawasaki_conjunctivitis_n 2 0.87 23.23 25.17 6.0 11.00 17.00 23.00 103.0 ▇▂▁▁▁ 302.0 51.01
symp_effusion_n 13 0.13 8.50 4.95 5.0 6.75 8.50 10.25 12.0 ▇▁▁▁▇ 17.0 2.87
symp_arthritis_n 12 0.20 1.67 2.08 0.0 0.50 1.00 2.50 4.0 ▇▇▁▁▇ 5.0 0.84
symp_mas 13 0.13 0.00 0.00 0.0 0.00 0.00 0.00 0.0 ▁▁▇▁▁ 0.0 0.00
lab_Hb_NS_n 10 0.33 37.80 13.92 21.0 33.00 33.00 44.00 58.0 ▃▇▁▃▃ 189.0 31.93
lab_Hb_NS_med 10 0.33 10.30 1.30 8.6 9.20 11.20 11.20 11.3 ▂▂▁▁▇ 51.5 8.70
lab_Hb_NS_Q1 12 0.20 9.45 1.10 8.3 8.93 9.55 10.03 10.5 ▇▁▇▁▇ 28.4 4.79
lab_Hb_NS_Q3 12 0.20 11.60 1.15 10.3 11.15 12.00 12.25 12.5 ▇▁▁▇▇ 34.8 5.88
lab_Hb_baseline_n 14 0.07 17.00 NA 17.0 17.00 17.00 17.00 17.0 ▁▁▇▁▁ 17.0 2.87
lab_Hb_baseline_med 14 0.07 11.20 NA 11.2 11.20 11.20 11.20 11.2 ▁▁▇▁▁ 11.2 1.89
lab_WBC_NS_n 6 0.60 30.56 16.19 7.0 21.00 33.00 35.00 58.0 ▃▂▇▂▂ 275.0 46.45
lab_WBC_NS_med 3 0.80 12151.67 3022.43 9100.0 9695.00 11100.00 13525.00 17400.0 ▇▇▂▁▆ 145820.0 24631.76
lab_WBC_NS_Q1 5 0.67 9334.00 2129.50 6400.0 7550.00 9075.00 11400.00 12000.0 ▇▅▂▂▇ 93340.0 15766.89
lab_WBC_NS_Q3 5 0.67 17333.00 5852.26 11900.0 13775.00 14600.00 20800.00 30000.0 ▇▁▁▁▁ 173330.0 29278.72
lab_WBC_baseline_n 14 0.07 17.00 NA 17.0 17.00 17.00 17.00 17.0 ▁▁▇▁▁ 17.0 2.87
lab_WBC_baseline_med 14 0.07 14000.00 NA 14000.0 14000.00 14000.00 14000.00 14000.0 ▁▁▇▁▁ 14000.0 2364.86
lab_neutro_NS_n 9 0.40 27.33 19.15 7.0 12.00 27.50 34.75 58.0 ▇▃▇▁▃ 164.0 27.70
lab_neutro_NS_med 9 0.40 11333.33 2211.49 8000.0 10100.00 11700.00 13000.00 13600.0 ▂▂▂▁▇ 68000.0 11486.49
lab_neutro_NS_Q1 10 0.33 8520.00 1425.48 6400.0 8000.00 8600.00 9600.00 10000.0 ▃▁▃▃▇ 42600.0 7195.95
lab_neutro_NS_Q3 10 0.33 14260.00 4497.55 9600.0 10700.00 13000.00 19000.00 19000.0 ▇▃▁▁▇ 71300.0 12043.92
lab_lympho_NS_n 8 0.47 28.00 17.56 7.0 15.00 33.00 34.00 58.0 ▅▂▇▁▂ 196.0 33.11
lab_lympho_NS_med 8 0.47 1047.14 273.66 800.0 865.00 1000.00 1100.00 1600.0 ▇▇▁▁▂ 7330.0 1238.18
lab_lympho_NS_Q1 9 0.40 676.67 195.82 490.0 525.00 635.00 767.50 1000.0 ▇▇▁▃▃ 4060.0 685.81
lab_lympho_NS_Q3 9 0.40 1390.00 199.10 1120.0 1300.00 1360.00 1480.00 1700.0 ▃▇▃▃▃ 8340.0 1408.78
lab_lympho_baseline_n 14 0.07 17.00 NA 17.0 17.00 17.00 17.00 17.0 ▁▁▇▁▁ 17.0 2.87
lab_lympho_baseline_med 14 0.07 1212.10 NA 1212.1 1212.10 1212.10 1212.10 1212.1 ▁▁▇▁▁ 1212.1 204.75
lab_platelet_NS_n 4 0.73 30.45 14.79 7.0 23.50 33.00 37.50 58.0 ▃▃▇▃▂ 335.0 56.59
lab_platelet_NS_med 4 0.73 199000.00 101826.32 125000.0 157000.00 176000.00 189500.00 499000.0 ▇▁▁▁▁ 2189000.0 369763.51
lab_platelet_NS_Q1 6 0.60 124055.56 22705.24 100000.0 104000.00 130000.00 135000.00 170000.0 ▇▁▇▁▂ 1116500.0 188597.97
lab_platelet_NS_Q3 6 0.60 234333.33 33797.19 200000.0 210000.00 224000.00 240000.00 297000.0 ▇▇▂▁▅ 2109000.0 356250.00
lab_platelet_baseline_n 14 0.07 17.00 NA 17.0 17.00 17.00 17.00 17.0 ▁▁▇▁▁ 17.0 2.87
lab_platelet_baseline_med 14 0.07 237000.00 NA 237000.0 237000.00 237000.00 237000.00 237000.0 ▁▁▇▁▁ 237000.0 40033.78
lab_platelet_lowest_n 14 0.07 185.00 NA 185.0 185.00 185.00 185.00 185.0 ▁▁▇▁▁ 185.0 31.25
lab_platelet_lowest_med 14 0.07 133000.00 NA 133000.0 133000.00 133000.00 133000.00 133000.0 ▁▁▇▁▁ 133000.0 22466.22
lab_platelet_lowest_Q1 14 0.07 88000.00 NA 88000.0 88000.00 88000.00 88000.00 88000.0 ▁▁▇▁▁ 88000.0 14864.86
lab_platelet_lowest_Q3 14 0.07 235000.00 NA 235000.0 235000.00 235000.00 235000.00 235000.0 ▁▁▇▁▁ 235000.0 39695.95
lab_sodium_NS_n 10 0.33 20.60 12.52 7.0 9.00 21.00 33.00 33.0 ▇▁▃▁▇ 103.0 17.40
lab_sodium_NS_med 10 0.33 131.20 3.42 127.0 130.00 130.00 133.00 136.0 ▃▇▁▃▃ 656.0 110.81
lab_sodium_NS_Q1 11 0.27 130.50 3.42 127.0 128.50 130.00 132.00 135.0 ▇▇▇▁▇ 522.0 88.18
lab_sodium_NS_Q3 11 0.27 135.50 2.89 132.0 134.25 135.50 136.75 139.0 ▃▁▇▁▃ 542.0 91.55
lab_sodium_baseline_n 14 0.07 17.00 NA 17.0 17.00 17.00 17.00 17.0 ▁▁▇▁▁ 17.0 2.87
lab_sodium_baseline_med 14 0.07 133.10 NA 133.1 133.10 133.10 133.10 133.1 ▁▁▇▁▁ 133.1 22.48
lab_ferritin_NS_n 6 0.60 28.67 15.42 7.0 23.00 33.00 35.00 58.0 ▃▃▇▁▂ 258.0 43.58
lab_ferritin_NS_med 6 0.60 674.33 423.04 295.0 540.00 610.00 631.00 1760.0 ▇▇▁▁▂ 6069.0 1025.17
lab_ferritin_NS_Q1 6 0.60 446.44 472.82 165.0 293.00 313.00 359.00 1693.0 ▇▁▁▁▁ 4018.0 678.72
lab_ferritin_NS_Q3 6 0.60 1110.56 568.27 536.0 880.00 954.00 1192.00 2500.0 ▅▇▁▁▂ 9995.0 1688.34
lab_ferritin_baseline_n 14 0.07 17.00 NA 17.0 17.00 17.00 17.00 17.0 ▁▁▇▁▁ 17.0 2.87
lab_ferritin_baseline_med 14 0.07 647.90 NA 647.9 647.90 647.90 647.90 647.9 ▁▁▇▁▁ 647.9 109.44
lab_ferritin_peak_n 13 0.13 89.00 104.65 15.0 52.00 89.00 126.00 163.0 ▇▁▁▁▇ 178.0 30.07
lab_ferritin_peak_med 13 0.13 598.50 57.28 558.0 578.25 598.50 618.75 639.0 ▇▁▁▁▇ 1197.0 202.20
lab_ferritin_peak_Q1 13 0.13 348.35 22.13 332.7 340.52 348.35 356.18 364.0 ▇▁▁▁▇ 696.7 117.69
lab_ferritin_peak_Q3 13 0.13 1251.60 103.80 1178.2 1214.90 1251.60 1288.30 1325.0 ▇▁▁▁▇ 2503.2 422.84
lab_ALT_NS_n 10 0.33 37.80 13.92 21.0 33.00 33.00 44.00 58.0 ▃▇▁▃▃ 189.0 31.93
lab_ALT_NS_median 10 0.33 42.10 16.90 24.5 36.00 38.00 42.00 70.0 ▂▇▁▁▂ 210.5 35.56
lab_ALT_NS_Q1 12 0.20 28.00 2.00 26.0 27.00 28.00 29.00 30.0 ▇▁▇▁▇ 84.0 14.19
lab_ALT_NS_Q3 12 0.20 70.67 21.78 53.0 58.50 64.00 79.50 95.0 ▇▇▁▁▇ 212.0 35.81
lab_ALT_baseline_n 14 0.07 17.00 NA 17.0 17.00 17.00 17.00 17.0 ▁▁▇▁▁ 17.0 2.87
lab_ALT_baseline_med 14 0.07 49.60 NA 49.6 49.60 49.60 49.60 49.6 ▁▁▇▁▁ 49.6 8.38
lab_AST_NS_n 12 0.20 36.67 6.35 33.0 33.00 33.00 38.50 44.0 ▇▁▁▁▃ 110.0 18.58
lab_AST_NS_med 12 0.20 44.33 11.93 31.0 39.50 48.00 51.00 54.0 ▇▁▁▇▇ 133.0 22.47
lab_AST_NS_Q1 13 0.13 31.50 6.36 27.0 29.25 31.50 33.75 36.0 ▇▁▁▁▇ 63.0 10.64
lab_AST_NS_Q3 13 0.13 72.50 4.95 69.0 70.75 72.50 74.25 76.0 ▇▁▁▁▇ 145.0 24.49
lab_AST_baseline_n 14 0.07 17.00 NA 17.0 17.00 17.00 17.00 17.0 ▁▁▇▁▁ 17.0 2.87
lab_AST_baseline_med 14 0.07 51.50 NA 51.5 51.50 51.50 51.50 51.5 ▁▁▇▁▁ 51.5 8.70
lab_albumin_NS_n 5 0.67 29.90 15.66 7.0 21.75 31.00 39.00 58.0 ▅▅▇▅▂ 299.0 50.51
lab_albumin_NS_med 5 0.67 28.55 6.57 18.5 22.50 31.00 33.50 37.0 ▇▂▁▇▇ 285.5 48.23
lab_albumin_NS_Q1 7 0.53 24.12 3.68 18.0 21.75 25.00 26.00 30.0 ▃▇▇▇▃ 193.0 32.60
lab_albumin_NS_Q3 7 0.53 32.00 7.25 20.0 26.25 35.50 37.25 39.0 ▂▃▁▂▇ 256.0 43.24
lab_albumin_low_n 14 0.07 178.00 NA 178.0 178.00 178.00 178.00 178.0 ▁▁▇▁▁ 178.0 30.07
lab_albumin_low_med 14 0.07 25.00 NA 25.0 25.00 25.00 25.00 25.0 ▁▁▇▁▁ 25.0 4.22
lab_albumin_low_Q1 14 0.07 20.00 NA 20.0 20.00 20.00 20.00 20.0 ▁▁▇▁▁ 20.0 3.38
lab_albumin_low_Q3 14 0.07 29.00 NA 29.0 29.00 29.00 29.00 29.0 ▁▁▇▁▁ 29.0 4.90
lab_LDH_baseline_n 13 0.13 18.00 1.41 17.0 17.50 18.00 18.50 19.0 ▇▁▁▁▇ 36.0 6.08
lab_LDH_baseline_med 13 0.13 254.90 152.59 147.0 200.95 254.90 308.85 362.8 ▇▁▁▁▇ 509.8 86.11
lab_LDH_baseline_Q1 14 0.07 110.00 NA 110.0 110.00 110.00 110.00 110.0 ▁▁▇▁▁ 110.0 18.58
lab_LDH_baseline_Q3 14 0.07 510.00 NA 510.0 510.00 510.00 510.00 510.0 ▁▁▇▁▁ 510.0 86.15
lab_LDH_NS_n 11 0.27 25.50 7.55 19.0 19.00 25.00 31.50 33.0 ▇▁▁▁▇ 102.0 17.23
lab_LDH_NS_med 11 0.27 315.25 18.46 288.0 312.00 322.50 325.75 328.0 ▃▁▁▃▇ 1261.0 213.01
lab_LDH_NS_Q1 11 0.27 268.75 11.79 256.0 261.25 268.00 275.50 283.0 ▇▇▁▇▇ 1075.0 181.59
lab_LDH_NS_Q3 11 0.27 413.00 51.48 342.0 399.75 422.50 435.75 465.0 ▃▁▁▇▃ 1652.0 279.05
lab_CK_baseline_n 14 0.07 19.00 NA 19.0 19.00 19.00 19.00 19.0 ▁▁▇▁▁ 19.0 3.21
lab_CK_baseline_med 14 0.07 147.00 NA 147.0 147.00 147.00 147.00 147.0 ▁▁▇▁▁ 147.0 24.83
lab_CK_baseline_Q1 14 0.07 110.00 NA 110.0 110.00 110.00 110.00 110.0 ▁▁▇▁▁ 110.0 18.58
lab_CK_baseline_Q3 14 0.07 510.00 NA 510.0 510.00 510.00 510.00 510.0 ▁▁▇▁▁ 510.0 86.15
lab_CK_peak_n 14 0.07 15.00 NA 15.0 15.00 15.00 15.00 15.0 ▁▁▇▁▁ 15.0 2.53
lab_CK_peak_med 14 0.07 385.00 NA 385.0 385.00 385.00 385.00 385.0 ▁▁▇▁▁ 385.0 65.03
lab_CK_peak_Q1 14 0.07 117.00 NA 117.0 117.00 117.00 117.00 117.0 ▁▁▇▁▁ 117.0 19.76
lab_CK_peak_Q3 14 0.07 1615.00 NA 1615.0 1615.00 1615.00 1615.00 1615.0 ▁▁▇▁▁ 1615.0 272.80
lab_Ddim_baseline_n 13 0.13 18.50 2.12 17.0 17.75 18.50 19.25 20.0 ▇▁▁▁▇ 37.0 6.25
lab_Ddim_baseline_med 13 0.13 4642.00 907.93 4000.0 4321.00 4642.00 4963.00 5284.0 ▇▁▁▁▇ 9284.0 1568.24
lab_Ddim_baseline_Q1 14 0.07 4069.00 NA 4069.0 4069.00 4069.00 4069.00 4069.0 ▁▁▇▁▁ 4069.0 687.33
lab_Ddim_baseline_Q3 14 0.07 9095.00 NA 9095.0 9095.00 9095.00 9095.00 9095.0 ▁▁▇▁▁ 9095.0 1536.32
lab_Ddim_NS_n 7 0.53 34.12 11.41 20.0 27.50 33.00 36.25 58.0 ▃▇▂▁▂ 273.0 46.11
lab_Ddim_NS_med 7 0.53 3112.88 1124.58 1700.0 2325.00 3139.00 3781.25 4900.0 ▇▇▃▇▃ 24903.0 4206.59
lab_Ddim_NS_Q1 8 0.47 1791.86 881.26 800.0 1129.00 1700.00 2242.50 3300.0 ▇▂▂▂▂ 12543.0 2118.75
lab_Ddim_NS_Q3 8 0.47 5335.00 2878.01 2410.0 3450.00 4400.00 6667.50 10300.0 ▇▅▁▂▂ 37345.0 6308.28
lab_Ddim_peak_n 13 0.13 66.50 72.83 15.0 40.75 66.50 92.25 118.0 ▇▁▁▁▇ 133.0 22.47
lab_Ddim_peak_med 13 0.13 3075.00 1435.43 2060.0 2567.50 3075.00 3582.50 4090.0 ▇▁▁▁▇ 6150.0 1038.85
lab_Ddim_peak_Q1 13 0.13 1700.00 763.68 1160.0 1430.00 1700.00 1970.00 2240.0 ▇▁▁▁▇ 3400.0 574.32
lab_Ddim_peak_Q3 13 0.13 5507.25 4097.33 2610.0 4058.62 5507.25 6955.88 8404.5 ▇▁▁▁▇ 11014.5 1860.56
lab_fibrino_NS_n 10 0.33 26.40 8.17 17.0 18.00 31.00 33.00 33.0 ▅▁▁▁▇ 132.0 22.30
lab_fibrino_NS_med 10 0.33 655.20 92.14 551.0 596.00 627.00 736.00 766.0 ▃▇▁▁▇ 3276.0 553.38
lab_fibrino_NS_Q1 10 0.33 515.20 103.01 386.0 455.00 496.00 619.00 620.0 ▃▃▃▁▇ 2576.0 435.14
lab_fibrino_NS_Q3 10 0.33 779.20 76.22 689.0 719.00 782.00 836.00 870.0 ▇▁▃▁▇ 3896.0 658.11
lab_troponin_baseline_n 13 0.13 26.00 12.73 17.0 21.50 26.00 30.50 35.0 ▇▁▁▁▇ 52.0 8.78
lab_troponin_baseline_med 13 0.13 201.90 205.20 56.8 129.35 201.90 274.45 347.0 ▇▁▁▁▇ 403.8 68.21
lab_troponin_baseline_Q1 14 0.07 182.00 NA 182.0 182.00 182.00 182.00 182.0 ▁▁▇▁▁ 182.0 30.74
lab_troponin_baseline_Q3 14 0.07 1267.00 NA 1267.0 1267.00 1267.00 1267.00 1267.0 ▁▁▇▁▁ 1267.0 214.02
lab_troponin_peak_n 13 0.13 15.50 0.71 15.0 15.25 15.50 15.75 16.0 ▇▁▁▁▇ 31.0 5.24
lab_troponin_peak_med 13 0.13 402.00 8.49 396.0 399.00 402.00 405.00 408.0 ▇▁▁▁▇ 804.0 135.81
lab_troponin_peak_Q1 13 0.13 179.00 111.72 100.0 139.50 179.00 218.50 258.0 ▇▁▁▁▇ 358.0 60.47
lab_troponin_peak_Q3 13 0.13 979.50 424.97 679.0 829.25 979.50 1129.75 1280.0 ▇▁▁▁▇ 1959.0 330.91
lab_troponin_NS_n 8 0.47 28.00 17.56 7.0 15.00 33.00 34.00 58.0 ▅▂▇▁▂ 196.0 33.11
lab_troponin_NS_med 8 0.47 84.14 88.75 31.0 42.50 47.00 72.00 282.0 ▇▁▁▁▁ 589.0 99.49
lab_troponin_NS_Q1 9 0.40 24.33 17.96 6.0 11.00 20.50 34.50 52.0 ▇▇▁▃▃ 146.0 24.66
lab_troponin_NS_Q3 9 0.40 301.67 363.25 60.0 101.00 177.50 266.75 1023.0 ▇▂▁▁▂ 1810.0 305.74
lab_NTproBNP_baseline_n 12 0.20 12.67 6.66 5.0 10.50 16.00 16.50 17.0 ▃▁▁▁▇ 38.0 6.42
lab_NTproBNP_baseline_med 12 0.20 20548.33 19021.51 4328.0 10080.50 15833.00 28658.50 41484.0 ▇▇▁▁▇ 61645.0 10413.01
lab_NTproBNP_baseline_Q1 13 0.13 18964.00 23825.26 2117.0 10540.50 18964.00 27387.50 35811.0 ▇▁▁▁▇ 37928.0 6406.76
lab_NTproBNP_baseline_Q3 13 0.13 32922.50 27651.41 13370.0 23146.25 32922.50 42698.75 52475.0 ▇▁▁▁▇ 65845.0 11122.47
lab_NTproBNP_peak_n 13 0.13 15.50 0.71 15.0 15.25 15.50 15.75 16.0 ▇▁▁▁▇ 31.0 5.24
lab_NTproBNP_peak_med 13 0.13 19735.00 6696.30 15000.0 17367.50 19735.00 22102.50 24470.0 ▇▁▁▁▇ 39470.0 6667.23
lab_NTproBNP_peak_Q1 13 0.13 13270.50 5574.12 9329.0 11299.75 13270.50 15241.25 17212.0 ▇▁▁▁▇ 26541.0 4483.28
lab_NTproBNP_peak_Q3 13 0.13 20827.50 8241.33 15000.0 17913.75 20827.50 23741.25 26655.0 ▇▁▁▁▇ 41655.0 7036.32
lab_NTproBNP_NS_n 13 0.13 45.50 17.68 33.0 39.25 45.50 51.75 58.0 ▇▁▁▁▇ 91.0 15.37
lab_NTproBNP_NS_med 13 0.13 2056.50 1793.93 788.0 1422.25 2056.50 2690.75 3325.0 ▇▁▁▁▇ 4113.0 694.76
lab_NTproBNP_NS_Q1 13 0.13 407.00 329.51 174.0 290.50 407.00 523.50 640.0 ▇▁▁▁▇ 814.0 137.50
lab_NTproBNP_NS_Q3 13 0.13 8662.00 2667.21 6776.0 7719.00 8662.00 9605.00 10548.0 ▇▁▁▁▇ 17324.0 2926.35
lab_BNP_baseline_n 13 0.13 22.00 8.49 16.0 19.00 22.00 25.00 28.0 ▇▁▁▁▇ 44.0 7.43
lab_BNP_baseline_med 13 0.13 3065.50 3786.56 388.0 1726.75 3065.50 4404.25 5743.0 ▇▁▁▁▇ 6131.0 1035.64
lab_BNP_baseline_Q1 13 0.13 1361.50 1819.39 75.0 718.25 1361.50 2004.75 2648.0 ▇▁▁▁▇ 2723.0 459.97
lab_BNP_baseline_Q3 13 0.13 6497.50 7653.02 1086.0 3791.75 6497.50 9203.25 11909.0 ▇▁▁▁▇ 12995.0 2195.10
lab_BNP_peak_n 12 0.20 51.67 66.15 11.0 13.50 16.00 72.00 128.0 ▇▁▁▁▃ 155.0 26.18
lab_BNP_peak_med 12 0.20 2070.23 1905.37 760.0 977.35 1194.70 2725.35 4256.0 ▇▁▁▁▃ 6210.7 1049.10
lab_BNP_peak_Q1 12 0.20 1039.60 1126.18 388.0 389.40 390.80 1365.40 2340.0 ▇▁▁▁▃ 3118.8 526.82
lab_BNP_peak_Q3 12 0.20 4256.67 2583.18 1434.0 3133.50 4833.00 5668.00 6503.0 ▇▁▁▇▇ 12770.0 2157.09
lab_BNP_NS_n 11 0.27 11.25 4.79 7.0 8.50 10.00 12.75 18.0 ▇▃▁▁▃ 45.0 7.60
lab_BNP_NS_med 11 0.27 4262.50 2131.84 2231.0 3073.25 3805.00 4994.25 7209.0 ▇▇▇▁▇ 17050.0 2880.07
lab_BNP_NS_min 11 0.27 2442.75 2411.82 16.0 1252.00 2002.00 3192.75 5751.0 ▇▇▇▁▇ 9771.0 1650.51
lab_BNP_NS_max 11 0.27 8286.50 5441.64 3287.0 5699.00 6921.00 9508.50 16017.0 ▃▇▁▁▃ 33146.0 5598.99
lab_CRP_baseline_n 12 0.20 33.33 11.59 21.0 28.00 35.00 39.50 44.0 ▇▁▁▇▇ 100.0 16.89
lab_CRP_baseline_med 12 0.20 195.83 47.39 146.5 173.25 200.00 220.50 241.0 ▇▁▇▁▇ 587.5 99.24
lab_CRP_baseline_Q1 14 0.07 150.00 NA 150.0 150.00 150.00 150.00 150.0 ▁▁▇▁▁ 150.0 25.34
lab_CRP_baseline_Q3 14 0.07 311.00 NA 311.0 311.00 311.00 311.00 311.0 ▁▁▇▁▁ 311.0 52.53
lab_CRP_peak_n 11 0.27 66.00 71.67 15.0 28.50 38.50 76.00 172.0 ▇▁▁▁▂ 264.0 44.59
lab_CRP_peak_med 11 0.27 189.53 44.80 154.0 166.82 174.55 197.25 255.0 ▇▃▁▁▃ 758.1 128.06
lab_CRP_peak_Q1 12 0.20 146.00 30.32 128.0 128.50 129.00 155.00 181.0 ▇▁▁▁▃ 438.0 73.99
lab_CRP_peak_Q3 12 0.20 266.67 40.05 231.0 245.00 259.00 284.50 310.0 ▇▇▁▁▇ 800.0 135.14
lab_CRP_NS_n 5 0.67 29.40 14.95 7.0 22.25 32.00 34.50 58.0 ▃▃▇▂▂ 294.0 49.66
lab_CRP_NS_med 5 0.67 234.20 29.96 193.0 207.00 237.00 252.25 283.0 ▇▂▂▃▃ 2342.0 395.61
lab_CRP_NS_Q1 6 0.60 158.22 25.66 113.0 156.00 160.00 180.00 185.0 ▅▁▅▅▇ 1424.0 240.54
lab_CRP_NS_Q3 6 0.60 299.89 39.59 219.0 290.00 299.00 309.00 364.0 ▂▁▇▂▃ 2699.0 455.91
lab_ESR_baseline_n 14 0.07 44.00 NA 44.0 44.00 44.00 44.00 44.0 ▁▁▇▁▁ 44.0 7.43
lab_ESR_baseline_med 14 0.07 59.00 NA 59.0 59.00 59.00 59.00 59.0 ▁▁▇▁▁ 59.0 9.97
lab_ESR_peak_n 12 0.20 58.67 52.56 15.0 29.50 44.00 80.50 117.0 ▇▇▁▁▇ 176.0 29.73
lab_ESR_peak_med 12 0.20 69.67 5.03 65.0 67.00 69.00 72.00 75.0 ▇▇▁▁▇ 209.0 35.30
lab_ESR_peak_Q1 13 0.13 43.50 2.12 42.0 42.75 43.50 44.25 45.0 ▇▁▁▁▇ 87.0 14.70
lab_ESR_peak_Q3 13 0.13 90.50 0.71 90.0 90.25 90.50 90.75 91.0 ▇▁▁▁▇ 181.0 30.57
lab_ESR_NS_n 11 0.27 21.25 8.22 14.0 17.00 19.00 23.25 33.0 ▃▇▁▁▃ 85.0 14.36
lab_ESR_NS_med 11 0.27 57.75 5.17 53.0 54.88 56.50 59.38 65.0 ▃▇▁▁▃ 231.0 39.02
lab_ESR_NS_Q1 11 0.27 42.80 13.02 28.2 35.55 42.00 49.25 59.0 ▇▇▇▁▇ 171.2 28.92
lab_ESR_NS_Q3 11 0.27 78.17 6.90 72.0 74.62 76.35 79.90 88.0 ▃▇▁▁▃ 312.7 52.82
lab_PCT_baseline_n 13 0.13 23.50 3.54 21.0 22.25 23.50 24.75 26.0 ▇▁▁▁▇ 47.0 7.94
lab_PCT_baseline_med 13 0.13 28.85 10.11 21.7 25.27 28.85 32.42 36.0 ▇▁▁▁▇ 57.7 9.75
lab_PCT_baseline_Q1 14 0.07 8.00 NA 8.0 8.00 8.00 8.00 8.0 ▁▁▇▁▁ 8.0 1.35
lab_PCT_baseline_Q3 14 0.07 99.00 NA 99.0 99.00 99.00 99.00 99.0 ▁▁▇▁▁ 99.0 16.72
lab_PCT_peak_n 14 0.07 33.00 NA 33.0 33.00 33.00 33.00 33.0 ▁▁▇▁▁ 33.0 5.57
lab_PCT_peak_med 14 0.07 6.00 NA 6.0 6.00 6.00 6.00 6.0 ▁▁▇▁▁ 6.0 1.01
lab_PCT_peak_Q1 14 0.07 2.70 NA 2.7 2.70 2.70 2.70 2.7 ▁▁▇▁▁ 2.7 0.46
lab_PCT_peak_Q3 14 0.07 16.50 NA 16.5 16.50 16.50 16.50 16.5 ▁▁▇▁▁ 16.5 2.79
lab_PCT_NS_n 9 0.40 25.33 7.28 16.0 20.25 25.00 32.00 33.0 ▃▇▁▃▇ 152.0 25.68
lab_PCT_NS_med 9 0.40 10.01 7.10 2.7 5.58 8.70 11.86 22.5 ▇▁▅▁▂ 60.0 10.14
lab_PCT_NS_Q1 10 0.33 2.33 1.47 0.4 1.80 2.20 2.87 4.4 ▇▇▇▇▇ 11.7 1.97
lab_PCT_NS_Q3 10 0.33 20.15 4.42 15.8 16.70 18.50 24.80 25.0 ▇▃▁▁▇ 100.8 17.02
lab_IL6_baseline_n 11 0.27 19.50 7.90 13.0 16.00 17.00 20.50 31.0 ▃▇▁▁▃ 78.0 13.18
lab_IL6_baseline_med 11 0.27 187.62 43.10 135.0 161.25 194.60 220.97 226.3 ▃▃▁▁▇ 750.5 126.77
lab_IL6_baseline_Q1 14 0.07 87.00 NA 87.0 87.00 87.00 87.00 87.0 ▁▁▇▁▁ 87.0 14.70
lab_IL6_baseline_Q3 14 0.07 175.00 NA 175.0 175.00 175.00 175.00 175.0 ▁▁▇▁▁ 175.0 29.56
lab_IL6_NS_n 11 0.27 16.75 11.84 7.0 8.50 13.50 21.75 33.0 ▇▁▃▁▃ 67.0 11.32
lab_IL6_NS_med 11 0.27 151.50 66.17 80.0 103.25 155.50 203.75 215.0 ▃▃▁▁▇ 606.0 102.36
lab_IL6_NS_Q1 11 0.27 43.70 24.95 7.7 37.17 51.70 58.22 63.7 ▃▁▁▃▇ 174.8 29.53
lab_IL6_NS_Q3 11 0.27 308.10 18.80 286.0 297.55 308.20 318.75 330.0 ▇▇▁▇▇ 1232.4 208.18
lab_IL1_NS_n 14 0.07 33.00 NA 33.0 33.00 33.00 33.00 33.0 ▁▁▇▁▁ 33.0 5.57
lab_IL1_NS_med 14 0.07 0.80 NA 0.8 0.80 0.80 0.80 0.8 ▁▁▇▁▁ 0.8 0.14
lab_IL1_NS_Q1 14 0.07 0.40 NA 0.4 0.40 0.40 0.40 0.4 ▁▁▇▁▁ 0.4 0.07
lab_IL1_NS_Q3 14 0.07 1.20 NA 1.2 1.20 1.20 1.20 1.2 ▁▁▇▁▁ 1.2 0.20
lab_IL8_NS_n 14 0.07 33.00 NA 33.0 33.00 33.00 33.00 33.0 ▁▁▇▁▁ 33.0 5.57
lab_IL8_NS_med 14 0.07 41.70 NA 41.7 41.70 41.70 41.70 41.7 ▁▁▇▁▁ 41.7 7.04
lab_IL8_NS_Q1 14 0.07 25.10 NA 25.1 25.10 25.10 25.10 25.1 ▁▁▇▁▁ 25.1 4.24
lab_IL8_NS_Q3 14 0.07 54.40 NA 54.4 54.40 54.40 54.40 54.4 ▁▁▇▁▁ 54.4 9.19
admis_days_hosp_med 9 0.40 7.98 2.75 4.0 7.03 7.45 9.45 12.0 ▃▇▃▃▃ 47.9 8.09
admis_days_hosp_Q1 9 0.40 5.67 2.42 3.0 4.00 5.00 7.50 9.0 ▇▁▂▁▅ 34.0 5.74
admis_days_hosp_Q3 9 0.40 12.18 3.59 8.0 10.03 11.55 13.75 18.0 ▇▃▇▁▃ 73.1 12.35
admis_days_ICU_n 3 0.80 32.83 37.52 7.0 16.50 23.00 33.50 148.0 ▇▁▁▁▁ 394.0 66.55
admis_days_ICU_med 7 0.53 5.70 1.03 4.0 4.92 6.00 6.43 7.0 ▂▅▁▇▅ 45.6 7.70
admis_days_ICU_min 14 0.07 3.00 NA 3.0 3.00 3.00 3.00 3.0 ▁▁▇▁▁ 3.0 0.51
admis_days_ICU_Q1 9 0.40 3.95 1.10 3.0 3.17 3.85 4.00 6.0 ▅▇▁▁▂ 23.7 4.00
admis_days_ICU_Q3 9 0.40 8.50 1.97 5.0 8.00 9.00 10.00 10.0 ▂▁▅▁▇ 51.0 8.61
admis_days_ICU_max 14 0.07 12.00 NA 12.0 12.00 12.00 12.00 12.0 ▁▁▇▁▁ 12.0 2.03
critcare_NIV_n 7 0.53 6.62 5.01 0.0 2.75 6.00 11.25 13.0 ▅▅▁▂▇ 53.0 8.95
critcare_MV_n 0 1.00 8.67 10.81 0.0 2.50 4.00 9.00 37.0 ▇▁▁▁▁ 130.0 21.96
critcare_MV_med 13 0.13 3.00 0.00 3.0 3.00 3.00 3.00 3.0 ▁▁▇▁▁ 6.0 1.01
critcare_MV_min 15 0.00 NaN NaN NA NA NA NA NA 0.0 0.00
critcare_MV_max 15 0.00 NaN NaN NA NA NA NA NA 0.0 0.00
critcare_inotrop_n 1 0.93 21.57 21.60 0.0 10.00 17.00 26.50 90.0 ▇▅▁▁▁ 302.0 51.01
critcare_inotrop_med 12 0.20 3.00 0.00 3.0 3.00 3.00 3.00 3.0 ▁▁▇▁▁ 9.0 1.52
critcare_inotrop_Q1 12 0.20 2.33 0.58 2.0 2.00 2.00 2.50 3.0 ▇▁▁▁▃ 7.0 1.18
critcare_inotrop_Q3 12 0.20 4.50 1.50 3.0 3.75 4.50 5.25 6.0 ▇▁▇▁▇ 13.5 2.28
critcare_ECMO_n 5 0.67 2.80 3.43 0.0 1.00 1.50 2.75 10.0 ▇▁▁▁▁ 28.0 4.73
critcare_ECMO_med 14 0.07 4.50 NA 4.5 4.50 4.50 4.50 4.5 ▁▁▇▁▁ 4.5 0.76
critcare_ECMO_Q1 14 0.07 3.00 NA 3.0 3.00 3.00 3.00 3.0 ▁▁▇▁▁ 3.0 0.51
critcare_ECMO_Q3 14 0.07 6.00 NA 6.0 6.00 6.00 6.00 6.0 ▁▁▇▁▁ 6.0 1.01
critcare_RRT_n 12 0.20 2.33 3.21 0.0 0.50 1.00 3.50 6.0 ▇▁▁▁▃ 7.0 1.18
rx_cortic_n 1 0.93 22.71 23.09 1.0 10.50 16.50 28.25 91.0 ▇▂▁▁▁ 318.0 53.72
rx_aspirin_low_n 10 0.33 9.00 7.31 4.0 4.00 5.00 11.00 21.0 ▇▁▂▁▂ 45.0 7.60
rx_aspirin_high_n 12 0.20 2.67 0.58 2.0 2.50 3.00 3.00 3.0 ▃▁▁▁▇ 8.0 1.35
rx_aspirin_NS 14 0.07 29.00 NA 29.0 29.00 29.00 29.00 29.0 ▁▁▇▁▁ 29.0 4.90
rx_heparin_n 9 0.40 28.00 30.98 0.0 11.75 18.50 30.50 87.0 ▇▅▁▁▂ 168.0 28.38
rx_IVIg_once_n 1 0.93 30.36 34.44 7.0 13.00 23.00 32.25 144.0 ▇▂▁▁▁ 425.0 71.79
rx_IVIg_multip_n 8 0.47 9.00 13.67 1.0 1.50 4.00 8.00 39.0 ▇▂▁▁▂ 63.0 10.64
rx_anakinra_n 8 0.47 6.71 7.91 1.0 3.00 4.00 6.00 24.0 ▇▂▁▁▂ 47.0 7.94
rx_infliximab_n 12 0.20 3.00 4.36 0.0 0.50 1.00 4.50 8.0 ▇▁▁▁▃ 9.0 1.52
rx_tocilizumab_n 10 0.33 6.20 6.30 1.0 1.00 3.00 12.00 14.0 ▇▁▁▁▅ 31.0 5.24
rx_antibiotics_n 12 0.20 20.67 7.37 15.0 16.50 18.00 23.50 29.0 ▇▇▁▁▇ 62.0 10.47
rx_plasma_n 14 0.07 1.00 NA 1.0 1.00 1.00 1.00 1.0 ▁▁▇▁▁ 1.0 0.17
rx_remdesivir_n 14 0.07 7.00 NA 7.0 7.00 7.00 7.00 7.0 ▁▁▇▁▁ 7.0 1.18
outcome_death_n 0 1.00 0.60 1.06 0.0 0.00 0.00 1.00 4.0 ▇▅▁▁▁ 9.0 1.52
outcome_LVdysfunc_n 8 0.47 2.86 3.13 0.0 1.00 2.00 3.50 9.0 ▇▅▂▁▂ 20.0 3.38

3.4 Historical controls

Data summary
Name df_cohort_controls_stats
Number of rows 2
Number of columns 80
_______________________
Column type frequency:
character 7
numeric 73
________________________
Group variables None

Variable type: character

skim_variable n_missing complete_rate min max empty n_unique whitespace
doi 0 1 35 39 0 2 0
first_author 0 1 18 18 0 2 0
journal 0 1 4 13 0 2 0
cohort_id 0 1 18 19 0 2 0
cohort_type 0 1 7 7 0 1 0
prim_input 0 1 2 2 0 1 0
cross_check 0 1 3 3 0 1 0

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist sum Prct_total
date_of_publication 0 1.0 43991.50 2.12 43990.0 43990.75 43991.50 43992.25 43993.0 ▇▁▁▁▇ 87983.0 6507.62
tot_cases_n 0 1.0 676.00 644.88 220.0 448.00 676.00 904.00 1132.0 ▇▁▁▁▇ 1352.0 100.00
sex_m 1 0.5 128.00 NA 128.0 128.00 128.00 128.00 128.0 ▁▁▇▁▁ 128.0 9.47
sex_f 1 0.5 92.00 NA 92.0 92.00 92.00 92.00 92.0 ▁▁▇▁▁ 92.0 6.80
age_med_yrs 0 1.0 2.35 0.49 2.0 2.17 2.35 2.53 2.7 ▇▁▁▁▇ 4.7 0.35
age_Q1_yrs 0 1.0 1.30 0.14 1.2 1.25 1.30 1.35 1.4 ▇▁▁▁▇ 2.6 0.19
age_Q3_yrs 0 1.0 4.15 0.78 3.6 3.88 4.15 4.43 4.7 ▇▁▁▁▇ 8.3 0.61
race_n_white 1 0.5 48.00 NA 48.0 48.00 48.00 48.00 48.0 ▁▁▇▁▁ 48.0 3.55
race_n_black 1 0.5 67.00 NA 67.0 67.00 67.00 67.00 67.0 ▁▁▇▁▁ 67.0 4.96
race_n_asian 1 0.5 28.00 NA 28.0 28.00 28.00 28.00 28.0 ▁▁▇▁▁ 28.0 2.07
race_n_other 1 0.5 44.00 NA 44.0 44.00 44.00 44.00 44.0 ▁▁▇▁▁ 44.0 3.25
symp_cardiovasc_myocard_n 1 0.5 3.00 NA 3.0 3.00 3.00 3.00 3.0 ▁▁▇▁▁ 3.0 0.22
symp_cardiovasc_pericard_n 1 0.5 15.00 NA 15.0 15.00 15.00 15.00 15.0 ▁▁▇▁▁ 15.0 1.11
symp_cardiovasc_cordilat_n 1 0.5 42.00 NA 42.0 42.00 42.00 42.00 42.0 ▁▁▇▁▁ 42.0 3.11
kawasaki_complete_n 1 0.5 142.00 NA 142.0 142.00 142.00 142.00 142.0 ▁▁▇▁▁ 142.0 10.50
kawasaki_incomplete_n 1 0.5 78.00 NA 78.0 78.00 78.00 78.00 78.0 ▁▁▇▁▁ 78.0 5.77
kawasaki_exanthema_n 1 0.5 187.00 NA 187.0 187.00 187.00 187.00 187.0 ▁▁▇▁▁ 187.0 13.83
kawasaki_mouth_n 1 0.5 189.00 NA 189.0 189.00 189.00 189.00 189.0 ▁▁▇▁▁ 189.0 13.98
kawasaki_extremity_n 1 0.5 120.00 NA 120.0 120.00 120.00 120.00 120.0 ▁▁▇▁▁ 120.0 8.88
kawasaki_cervical_n 1 0.5 114.00 NA 114.0 114.00 114.00 114.00 114.0 ▁▁▇▁▁ 114.0 8.43
kawasaki_conjunctivitis_n 1 0.5 176.00 NA 176.0 176.00 176.00 176.00 176.0 ▁▁▇▁▁ 176.0 13.02
lab_Hb_NS_n 1 0.5 1132.00 NA 1132.0 1132.00 1132.00 1132.00 1132.0 ▁▁▇▁▁ 1132.0 83.73
lab_Hb_NS_med 1 0.5 11.10 NA 11.1 11.10 11.10 11.10 11.1 ▁▁▇▁▁ 11.1 0.82
lab_Hb_NS_Q1 1 0.5 10.50 NA 10.5 10.50 10.50 10.50 10.5 ▁▁▇▁▁ 10.5 0.78
lab_Hb_NS_Q3 1 0.5 11.90 NA 11.9 11.90 11.90 11.90 11.9 ▁▁▇▁▁ 11.9 0.88
lab_WBC_NS_n 1 0.5 1132.00 NA 1132.0 1132.00 1132.00 1132.00 1132.0 ▁▁▇▁▁ 1132.0 83.73
lab_WBC_NS_med 1 0.5 13400.00 NA 13400.0 13400.00 13400.00 13400.00 13400.0 ▁▁▇▁▁ 13400.0 991.12
lab_WBC_NS_Q1 1 0.5 10500.00 NA 10500.0 10500.00 10500.00 10500.00 10500.0 ▁▁▇▁▁ 10500.0 776.63
lab_WBC_NS_Q3 1 0.5 17300.00 NA 17300.0 17300.00 17300.00 17300.00 17300.0 ▁▁▇▁▁ 17300.0 1279.59
lab_neutro_NS_n 1 0.5 1132.00 NA 1132.0 1132.00 1132.00 1132.00 1132.0 ▁▁▇▁▁ 1132.0 83.73
lab_neutro_NS_med 1 0.5 7200.00 NA 7200.0 7200.00 7200.00 7200.00 7200.0 ▁▁▇▁▁ 7200.0 532.54
lab_neutro_NS_Q1 1 0.5 5100.00 NA 5100.0 5100.00 5100.00 5100.00 5100.0 ▁▁▇▁▁ 5100.0 377.22
lab_neutro_NS_Q3 1 0.5 9900.00 NA 9900.0 9900.00 9900.00 9900.00 9900.0 ▁▁▇▁▁ 9900.0 732.25
lab_lympho_NS_n 0 1.0 676.00 644.88 220.0 448.00 676.00 904.00 1132.0 ▇▁▁▁▇ 1352.0 100.00
lab_lympho_NS_med 0 1.0 2940.00 197.99 2800.0 2870.00 2940.00 3010.00 3080.0 ▇▁▁▁▇ 5880.0 434.91
lab_lympho_NS_Q1 0 1.0 1680.00 254.56 1500.0 1590.00 1680.00 1770.00 1860.0 ▇▁▁▁▇ 3360.0 248.52
lab_lympho_NS_Q3 0 1.0 4585.00 261.63 4400.0 4492.50 4585.00 4677.50 4770.0 ▇▁▁▁▇ 9170.0 678.25
lab_platelet_NS_n 0 1.0 676.00 644.88 220.0 448.00 676.00 904.00 1132.0 ▇▁▁▁▇ 1352.0 100.00
lab_platelet_NS_med 0 1.0 374000.00 12727.92 365000.0 369500.00 374000.00 378500.00 383000.0 ▇▁▁▁▇ 748000.0 55325.44
lab_platelet_NS_Q1 0 1.0 288500.00 707.11 288000.0 288250.00 288500.00 288750.00 289000.0 ▇▁▁▁▇ 577000.0 42677.51
lab_platelet_NS_Q3 0 1.0 476500.00 20506.10 462000.0 469250.00 476500.00 483750.00 491000.0 ▇▁▁▁▇ 953000.0 70488.17
lab_sodium_NS_n 1 0.5 220.00 NA 220.0 220.00 220.00 220.00 220.0 ▁▁▇▁▁ 220.0 16.27
lab_sodium_NS_med 1 0.5 135.00 NA 135.0 135.00 135.00 135.00 135.0 ▁▁▇▁▁ 135.0 9.99
lab_sodium_NS_Q1 1 0.5 134.00 NA 134.0 134.00 134.00 134.00 134.0 ▁▁▇▁▁ 134.0 9.91
lab_sodium_NS_Q3 1 0.5 137.00 NA 137.0 137.00 137.00 137.00 137.0 ▁▁▇▁▁ 137.0 10.13
lab_ferritin_NS_n 1 0.5 1132.00 NA 1132.0 1132.00 1132.00 1132.00 1132.0 ▁▁▇▁▁ 1132.0 83.73
lab_ferritin_NS_med 1 0.5 200.00 NA 200.0 200.00 200.00 200.00 200.0 ▁▁▇▁▁ 200.0 14.79
lab_ferritin_NS_Q1 1 0.5 143.00 NA 143.0 143.00 143.00 143.00 143.0 ▁▁▇▁▁ 143.0 10.58
lab_ferritin_NS_Q3 1 0.5 243.00 NA 243.0 243.00 243.00 243.00 243.0 ▁▁▇▁▁ 243.0 17.97
lab_ALT_NS_n 1 0.5 1132.00 NA 1132.0 1132.00 1132.00 1132.00 1132.0 ▁▁▇▁▁ 1132.0 83.73
lab_ALT_NS_median 1 0.5 42.00 NA 42.0 42.00 42.00 42.00 42.0 ▁▁▇▁▁ 42.0 3.11
lab_ALT_NS_Q1 1 0.5 24.00 NA 24.0 24.00 24.00 24.00 24.0 ▁▁▇▁▁ 24.0 1.78
lab_ALT_NS_Q3 1 0.5 112.00 NA 112.0 112.00 112.00 112.00 112.0 ▁▁▇▁▁ 112.0 8.28
lab_albumin_NS_n 0 1.0 676.00 644.88 220.0 448.00 676.00 904.00 1132.0 ▇▁▁▁▇ 1352.0 100.00
lab_albumin_NS_med 0 1.0 31.50 9.19 25.0 28.25 31.50 34.75 38.0 ▇▁▁▁▇ 63.0 4.66
lab_albumin_NS_Q1 0 1.0 28.50 9.19 22.0 25.25 28.50 31.75 35.0 ▇▁▁▁▇ 57.0 4.22
lab_albumin_NS_Q3 0 1.0 34.50 9.19 28.0 31.25 34.50 37.75 41.0 ▇▁▁▁▇ 69.0 5.10
lab_Ddim_NS_n 1 0.5 1132.00 NA 1132.0 1132.00 1132.00 1132.00 1132.0 ▁▁▇▁▁ 1132.0 83.73
lab_Ddim_NS_med 1 0.5 1650.00 NA 1650.0 1650.00 1650.00 1650.00 1650.0 ▁▁▇▁▁ 1650.0 122.04
lab_Ddim_NS_Q1 1 0.5 970.00 NA 970.0 970.00 970.00 970.00 970.0 ▁▁▇▁▁ 970.0 71.75
lab_Ddim_NS_Q3 1 0.5 2660.00 NA 2660.0 2660.00 2660.00 2660.00 2660.0 ▁▁▇▁▁ 2660.0 196.75
lab_troponin_NS_n 1 0.5 1132.00 NA 1132.0 1132.00 1132.00 1132.00 1132.0 ▁▁▇▁▁ 1132.0 83.73
lab_troponin_NS_med 1 0.5 10.00 NA 10.0 10.00 10.00 10.00 10.0 ▁▁▇▁▁ 10.0 0.74
lab_troponin_NS_Q1 1 0.5 10.00 NA 10.0 10.00 10.00 10.00 10.0 ▁▁▇▁▁ 10.0 0.74
lab_troponin_NS_Q3 1 0.5 20.00 NA 20.0 20.00 20.00 20.00 20.0 ▁▁▇▁▁ 20.0 1.48
lab_NTproBNP_NS_n 1 0.5 1132.00 NA 1132.0 1132.00 1132.00 1132.00 1132.0 ▁▁▇▁▁ 1132.0 83.73
lab_NTproBNP_NS_med 1 0.5 41.00 NA 41.0 41.00 41.00 41.00 41.0 ▁▁▇▁▁ 41.0 3.03
lab_NTproBNP_NS_Q1 1 0.5 12.00 NA 12.0 12.00 12.00 12.00 12.0 ▁▁▇▁▁ 12.0 0.89
lab_NTproBNP_NS_Q3 1 0.5 102.00 NA 102.0 102.00 102.00 102.00 102.0 ▁▁▇▁▁ 102.0 7.54
lab_CRP_NS_n 0 1.0 676.00 644.88 220.0 448.00 676.00 904.00 1132.0 ▇▁▁▁▇ 1352.0 100.00
lab_CRP_NS_med 0 1.0 104.50 53.03 67.0 85.75 104.50 123.25 142.0 ▇▁▁▁▇ 209.0 15.46
lab_CRP_NS_Q1 0 1.0 67.50 38.89 40.0 53.75 67.50 81.25 95.0 ▇▁▁▁▇ 135.0 9.99
lab_CRP_NS_Q3 0 1.0 173.50 33.23 150.0 161.75 173.50 185.25 197.0 ▇▁▁▁▇ 347.0 25.67

4 Data exploration

4.2 Sex

n_cohort <- df_cohort %>% select(tot_cases_n) %>% sum()
var_cohort <- df_cohort %>% select(contains("sex"))
var_cohort <- colSums(var_cohort, na.rm = TRUE)
var_cohort <- var_cohort/sum(df_cohort$tot_cases_n)*100
var_cohort["sex_na"] <- (100 - var_cohort["sex_m"] - var_cohort["sex_f"])

var_control <- df_cohort_controls %>% filter(cohort_id == "Pouletty - control") %>% select(contains("sex"))
var_control <- colSums(var_control, na.rm = TRUE)
var_control <- var_control/sum(df_cohort_controls %>% filter(cohort_id == "Pouletty - control") %>% select(tot_cases_n))*100
var_control["sex_na"] <- (100 - var_control["sex_m"] - var_control["sex_f"])

n_single <- df_singlecases %>% nrow()
var_single <- df_singlecases %>% select(contains("sex"))
var_single$sex_m <- ifelse(var_single$sex == "M", TRUE, FALSE)
var_single$sex_f <- ifelse(var_single$sex == "F", TRUE, FALSE)
cols <- sapply(var_single, is.logical)
var_single[,cols] <- lapply(var_single[,cols], as.numeric)
var_single <- colSums(var_single %>% select(-sex), na.rm = TRUE)
var_single <- var_single/nrow(df_singlecases)*100
var_single["sex_na"] <- (100 - var_single["sex_m"] - var_single["sex_f"])

bar_df_prct <- data.frame(
  x = c("males", "females", "missing", "males", "females", "missing", "males", "females", "missing"),
  vals = c(var_single, var_cohort, var_control),
  col = c(rep("single", length(var_single)), rep("cohorts", length(var_cohort)), rep("histor ctrl", length(var_control))
))

p_prct <- ggplot(bar_df_prct, aes(x = col, y =  vals, fill = x)) +
    geom_bar(stat = "identity", position = "stack") +
    theme_bw() + 
    labs(title = "Male/female distribution in dataset", subtitle = "Prct", x = "sex", y = "%", col = " ")  + lims(y = c(0,100)) + theme(axis.text.x=element_text(angle=90, hjust=1))+
  scale_fill_manual(values = wes_palette("Royal1"))
p_prct

var_cohort <- df_cohort %>% select(contains("sex") | ("cohort_id") | "tot_cases_n")
sex_f <- var_cohort %>% group_by(cohort_id) %>% summarize(prct = sex_f/tot_cases_n) %>%  mutate(sex = "female")
sex_m <- var_cohort %>% group_by(cohort_id) %>% summarize(prct = sex_m/tot_cases_n) %>% mutate(sex = "male")
sex_all <- rbind(sex_f, sex_m)

p_sex_cohort <- ggplot(sex_all, aes(y = cohort_id, x = prct, fill = sex)) + 
          geom_bar(stat = "identity", position = "fill") + 
          theme_bw() + labs(x = "") + 
          scale_fill_manual(values = wes_palette("Royal1"))

var_controls <- df_cohort_controls %>% filter(cohort_id == "Pouletty - control") %>% select(contains("sex") | ("cohort_id") | "tot_cases_n")
sex_f <- var_controls %>% group_by(cohort_id) %>% summarize(prct = sex_f/tot_cases_n) %>% mutate(sex = "female")
sex_m <- var_controls %>% group_by(cohort_id) %>% summarize(prct = sex_m/tot_cases_n) %>% mutate(sex = "male")
sex_all <- rbind(sex_f, sex_m)

p_sex_controls <- ggplot(sex_all, aes(y = cohort_id, x = prct, fill = sex)) + 
          geom_bar(stat = "identity", position = "fill") + 
          theme_bw() + labs(x = "") + 
          scale_fill_manual(values = wes_palette("Royal1"))

n_single <- df_singlecases %>% nrow()
var_single <- df_singlecases %>% select(contains("sex"))
var_single$sex_m <- ifelse(var_single$sex == "M", TRUE, FALSE)
var_single$sex_f <- ifelse(var_single$sex == "F", TRUE, FALSE)
cols <- sapply(var_single, is.logical)
var_single[,cols] <- lapply(var_single[,cols], as.numeric)
var_single <- colSums(var_single %>% select(-sex), na.rm = TRUE)
var_single <- var_single/nrow(df_singlecases)*100

sex_single <- data.frame(cohort_id = "single_cases", prct = c(var_single["sex_m"], var_single["sex_f"]), sex = c("male", "female"))

p_sex_single <- ggplot(sex_single, aes(y = cohort_id, x = prct, fill = sex)) + 
          geom_bar(stat = "identity", position = "fill") + 
          theme_bw() + 
          scale_fill_manual(values = wes_palette("Royal1"))

a <- plot_grid(p_sex_cohort, p_sex_controls, p_sex_single, align = "v", nrow = 3, rel_heights = c(5/7, 1/7, 1/7))
a

4.3 Age distribution

cohort_age <- df_cohort_controls %>% select(contains("cohort_id") | contains("age") | contains("cohort_type")  | contains("tot_cases_n"))
cohort_age$cohort_id <- paste0(cohort_age$cohort_id, " (n = ", cohort_age$tot_cases_n,")")
cohort_age$age_med_yrs <- as.numeric(cohort_age$age_med_yrs )
cohort_age$age_Q1_yrs <- as.numeric(cohort_age$age_Q1_yrs)
cohort_age$age_Q3_yrs <- as.numeric(cohort_age$age_Q3_yrs)
cohort_age$age_min_yrs <- as.numeric(cohort_age$age_min_yrs)
cohort_age$age_max_yrs <- as.numeric(cohort_age$age_max_yrs)

cohort_age$data_descr <- ifelse(!is.na(cohort_age$age_Q1_yrs) & is.na(cohort_age$age_min_yrs) , "IQR", 
                                ifelse(is.na(cohort_age$age_Q1_yrs) & !is.na(cohort_age$age_min_yrs), "range", 
                                    ifelse(!is.na(cohort_age$age_Q1_yrs) & !is.na(cohort_age$age_min_yrs), "both", "none")))

p_age_cohort <- ggplot(cohort_age %>% filter(cohort_type == "covid"), aes(y = cohort_id, x = age_med_yrs, col = data_descr)) + 
        geom_point(size = 4) + 
        geom_errorbar(aes(xmin=age_Q1_yrs, xmax=age_Q3_yrs), width=.8, position=position_dodge(.9)) +
        geom_errorbar(aes(xmin=age_min_yrs,  xmax=age_max_yrs), width=.2, position=position_dodge(.9)) +
        theme_bw() + lims(x = c(0,21)) + 
        labs(y = "cohort", x = "", col = "bars") + theme(legend.position="top")+
        scale_color_manual(values = c(wes_palette("BottleRocket2")[1:3], wes_palette("BottleRocket1")[2]))

p_age_controls <- ggplot(cohort_age %>% filter(cohort_type != "covid"), aes(y = cohort_id, x = age_med_yrs, col = data_descr)) + 
        geom_point(size = 4) + 
        geom_errorbar(aes(xmin=age_Q1_yrs, xmax=age_Q3_yrs), width=.2, position=position_dodge(.9)) +
        geom_errorbar(aes(xmin=age_min_yrs,  xmax=age_max_yrs), width=.2, position=position_dodge(.9)) +
        theme_bw() + lims(x = c(0,21)) +
        labs(y = "cohort", x = "", col = "bars") + theme(legend.position="none")+
        scale_color_manual(values = wes_palette("BottleRocket2")[2])

p_age_single <- ggplot(df_singlecases, aes(x = as.numeric(age), y = paste0("single cases (n = ", n_single,")"))) +
      geom_violin(fill = wes_palette("Darjeeling2")[4]) + 
      geom_boxplot(width=.3, fill = wes_palette("Darjeeling2")[1]) + 
      theme_bw() + geom_beeswarm(groupOnX=FALSE, alpha = 0.5) + lims(x = c(0,21)) + 
      labs(y = "cohort", x = "Age (years)")

a <- plot_grid(p_age_cohort, p_age_controls, p_age_single, align = "v", nrow = 3, rel_heights = c(2/3, 1/5, 1/3))
a

4.4 Symptoms

4.4.2 Single cases + cohort

4.4.2.1 Respiratory

barSymp <- function(colname_chort, colname_single, exclude_single = NULL, plottitle){

var_cohort <- df_cohort %>% 
                        select(contains("cohort_id") | contains("tot_cases_n") | (contains(colname_chort) & contains("_n")))

var_cohort <- var_cohort %>% 
        gather(variable, value, 3:ncol(var_cohort)) %>% 
        drop_na(value)  %>% group_by(variable) %>% 
        summarize(prct = sum(value)/sum(tot_cases_n)*100)

var_cohort <- setNames(var_cohort$prct, var_cohort$variable)
names(var_cohort) <- sub("_n", "", names(var_cohort))

n_single <- df_singlecases %>% nrow()

if (!is.null(exclude_single)){
  var_single <- df_singlecases %>% select(-contains(exclude_single))
  var_single <- var_single %>% select(contains(colname_single))
} else
{
  var_single <- df_singlecases %>% select(contains(colname_single))
}

 #%>% select(-contains("any"))
cols <- sapply(var_single, is.logical)
var_single[,cols] <- lapply(var_single[,cols], as.numeric)
var_single <- colSums(var_single, na.rm = TRUE)
var_single <- var_single/nrow(df_singlecases)*100

bar_df_prct <- data.frame(
  x = c(names(var_single), names(var_cohort)),
  vals = c(var_single, var_cohort),
  col = c(rep("single", length(var_single)), rep("cohorts", length(var_cohort)))
)

p_prct <- ggplot(bar_df_prct, aes(x = x, y =  vals, fill = col)) +
    geom_bar(stat = "identity", position = "dodge") +
    theme_bw() + 
    labs(title = plottitle, 
          subtitle = "Percent of group", x = "treatment", y = "%", col = " ")  + 
          theme(axis.text.x=element_text(angle=90, hjust=1))+
          scale_fill_manual(values = wes_palette("Royal1"))
p_prct
}

makeHeatmap_cohort("symp_resp", "symp_resp", plottitle = "Cases with respiratory symptoms, per cohort")

4.5 COVID contact

var_cohort <- df_cohort %>% select(("cohort_id" | "tot_cases_n") | ( contains("covid") & contains("_n") & (contains("pos") | contains("closecont")  | contains("any"))))
var_cohort$cohort_id <- paste0(var_cohort$cohort_id, " (n = ", as.character(var_cohort$tot_cases_n),")")

var_cohort <- var_cohort %>% 
  gather(variable, value, 3:ncol(var_cohort)) %>% group_by(cohort_id, variable) %>% summarize(prct = value/tot_cases_n*100)

var_cohort$variable <- sub("n_", "", var_cohort$variable)

var_single <- df_singlecases %>% select(contains("covid"))
cols <- sapply(var_single, is.logical)
var_single[,cols] <- lapply(var_single[,cols], as.numeric)
var_single <- colSums(var_single, na.rm = TRUE)
var_single <- var_single/nrow(df_singlecases)*100
var_single <- as.data.frame(var_single) %>% rownames_to_column()
var_single$cohort_id <- "single_cases"
colnames(var_single) <- c("variable", "prct", "cohort_id")


missing <- setdiff(var_single$variable, var_cohort$variable)
if (length(missing) != 0 ){
  missing_df <- data.frame(variable = missing, prct = rep(NA, length(missing)), cohort_id = rep(unique(var_cohort$cohort_id), length(missing)))
  var_cohort <- bind_rows(var_cohort, as_tibble(missing_df))
} 

missing <- setdiff(var_cohort$variable, var_single$variable)

if (length(missing) != 0) {
  if (length(missing) != 0){
data.frame(variable = missing, prct = rep(NA, length(missing)), cohort_id = rep(unique(var_single$cohort_id), length(missing)))
  var_single <- bind_rows(var_single, as_tibble(missing_df))
  }
}


hm_cohort <- ggplot(var_cohort, aes(x = variable, y = cohort_id, fill = prct)) + 
    geom_tile() + theme_classic() +
    theme(axis.text.x=element_blank(), axis.ticks.x=element_blank(), axis.line=element_blank())+
   scale_fill_gradient(low = "yellow", high="red", na.value = "lightgray", limits = c(0,100)) +
    labs(x = "", y = "cohort", title = "COVID symptoms, per cohort") +
    geom_text(aes(label=round(prct, 2)), size = 3, color = "black")

hm_single <- ggplot(var_single, aes(x = variable, y = cohort_id, fill = prct)) + 
    geom_tile() +  theme_classic() +
    theme(axis.text.x=element_text(angle=90, hjust=1), axis.line=element_blank())+
    scale_fill_gradient(low = "yellow", high = "red", na.value = "lightgray", limits = c(0,100))+ labs(y = "cohort") +
    geom_text(aes(label=round(prct, 2)), size = 3, color = "black") 

plot_grid(hm_cohort, hm_single, align = "v", nrow = 2, rel_heights = c(1/2, 1/2))

## [1] "Cases with neither PCR nor serology: 13"
## [1] "Cases with neither PCR nor serology nor closecontact: 9"

4.8 Lab values

For lab values, sometimes multiple values are reported (baseline, peak or not-specified). All lab values are collapsed based on the max (or the min for e.g. hemoglobin): so only the highest value of median, Q1 or Q3 is used.

4.8.1 C-reactive protein

## [1] "Column extracted from cohorts:"
##  [1] "lab_CRP_baseline_n"   "lab_CRP_baseline_med" "lab_CRP_baseline_Q1" 
##  [4] "lab_CRP_baseline_Q3"  "lab_CRP_peak_n"       "lab_CRP_peak_med"    
##  [7] "lab_CRP_peak_Q1"      "lab_CRP_peak_Q3"      "lab_CRP_NS_n"        
## [10] "lab_CRP_NS_med"       "lab_CRP_NS_Q1"        "lab_CRP_NS_Q3"       
## [13] "cohort_id"            "cohort_type"          "tot_cases_n"
## [1] "Column extracted from single cases:"
## [1] "lab_CRP_admis" "lab_CRP_NS"    "lab_CRP_peak"

4.8.2 Lymphocytes

## [1] "Column extracted from cohorts:"
## [1] "lab_lympho_NS_n"         "lab_lympho_NS_med"      
## [3] "lab_lympho_NS_Q1"        "lab_lympho_NS_Q3"       
## [5] "lab_lympho_baseline_n"   "lab_lympho_baseline_med"
## [7] "cohort_id"               "cohort_type"            
## [9] "tot_cases_n"
## [1] "Column extracted from single cases:"
## [1] "lab_lymphocytes_lowest"

4.8.3 White blood cells

## [1] "Column extracted from cohorts:"
## [1] "lab_WBC_NS_n"         "lab_WBC_NS_med"       "lab_WBC_NS_Q1"       
## [4] "lab_WBC_NS_Q3"        "lab_WBC_baseline_n"   "lab_WBC_baseline_med"
## [7] "cohort_id"            "cohort_type"          "tot_cases_n"
## [1] "Column extracted from single cases:"
## [1] "lab_WBC_highest"

4.8.4 Ferritin

## [1] "Column extracted from cohorts:"
##  [1] "lab_ferritin_NS_n"         "lab_ferritin_NS_med"      
##  [3] "lab_ferritin_NS_Q1"        "lab_ferritin_NS_Q3"       
##  [5] "lab_ferritin_baseline_n"   "lab_ferritin_baseline_med"
##  [7] "lab_ferritin_peak_n"       "lab_ferritin_peak_med"    
##  [9] "lab_ferritin_peak_Q1"      "lab_ferritin_peak_Q3"     
## [11] "cohort_id"                 "cohort_type"              
## [13] "tot_cases_n"
## [1] "Column extracted from single cases:"
## [1] "lab_ferritin_NS"    "lab_ferritin_admis" "lab_ferritin_peak"

4.8.5 Troponin

## [1] "Column extracted from cohorts:"
##  [1] "lab_troponin_baseline_n"   "lab_troponin_baseline_med"
##  [3] "lab_troponin_baseline_Q1"  "lab_troponin_baseline_Q3" 
##  [5] "lab_troponin_peak_n"       "lab_troponin_peak_med"    
##  [7] "lab_troponin_peak_Q1"      "lab_troponin_peak_Q3"     
##  [9] "lab_troponin_NS_n"         "lab_troponin_NS_med"      
## [11] "lab_troponin_NS_Q1"        "lab_troponin_NS_Q3"       
## [13] "cohort_id"                 "cohort_type"              
## [15] "tot_cases_n"
## [1] "Column extracted from single cases:"
## [1] "lab_troponin_admis" "lab_troponin_max"

4.8.6 IL-6

Note: The cases from Pouletty et al are added to the single cases as they report on IL6 values.

## [1] "Column extracted from cohorts:"
##  [1] "lab_IL6_baseline_n"   "lab_IL6_baseline_med" "lab_IL6_baseline_Q1" 
##  [4] "lab_IL6_baseline_Q3"  "lab_IL6_NS_n"         "lab_IL6_NS_med"      
##  [7] "lab_IL6_NS_Q1"        "lab_IL6_NS_Q3"        "cohort_id"           
## [10] "cohort_type"          "tot_cases_n"
## [1] "Column extracted from single cases:"
## [1] "lab_IL6"

4.8.7 BNP

## [1] "Column extracted from cohorts:"
##  [1] "lab_BNP_baseline_n"   "lab_BNP_baseline_med" "lab_BNP_baseline_Q1" 
##  [4] "lab_BNP_baseline_Q3"  "lab_BNP_peak_n"       "lab_BNP_peak_med"    
##  [7] "lab_BNP_peak_Q1"      "lab_BNP_peak_Q3"      "lab_BNP_NS_n"        
## [10] "lab_BNP_NS_med"       "lab_BNP_NS_min"       "lab_BNP_NS_max"      
## [13] "cohort_id"            "cohort_type"          "tot_cases_n"
## [1] "Column extracted from single cases:"
## [1] "lab_BNP_admis" "lab_BNP_max"

4.8.8 NTproBNP

## [1] "Column extracted from cohorts:"
##  [1] "lab_NTproBNP_baseline_n"   "lab_NTproBNP_baseline_med"
##  [3] "lab_NTproBNP_baseline_Q1"  "lab_NTproBNP_baseline_Q3" 
##  [5] "lab_NTproBNP_peak_n"       "lab_NTproBNP_peak_med"    
##  [7] "lab_NTproBNP_peak_Q1"      "lab_NTproBNP_peak_Q3"     
##  [9] "lab_NTproBNP_NS_n"         "lab_NTproBNP_NS_med"      
## [11] "lab_NTproBNP_NS_Q1"        "lab_NTproBNP_NS_Q3"       
## [13] "cohort_id"                 "cohort_type"              
## [15] "tot_cases_n"
## [1] "Column extracted from single cases:"
## [1] "lab_NTproBNP"

4.8.9 Platelets

## [1] "Column extracted from cohorts:"
##  [1] "lab_platelet_NS_n"         "lab_platelet_NS_med"      
##  [3] "lab_platelet_NS_Q1"        "lab_platelet_NS_Q3"       
##  [5] "lab_platelet_baseline_n"   "lab_platelet_baseline_med"
##  [7] "lab_platelet_lowest_n"     "lab_platelet_lowest_med"  
##  [9] "lab_platelet_lowest_Q1"    "lab_platelet_lowest_Q3"   
## [11] "cohort_id"                 "cohort_type"              
## [13] "tot_cases_n"
## [1] "Column extracted from single cases:"
## [1] "lab_platelets_NS"      "lab_platelets_highest" "lab_platelets_lowest"

4.8.10 D-dimers

## [1] "Column extracted from cohorts:"
##  [1] "lab_Ddim_baseline_n"   "lab_Ddim_baseline_med" "lab_Ddim_baseline_Q1" 
##  [4] "lab_Ddim_baseline_Q3"  "lab_Ddim_NS_n"         "lab_Ddim_NS_med"      
##  [7] "lab_Ddim_NS_Q1"        "lab_Ddim_NS_Q3"        "lab_Ddim_peak_n"      
## [10] "lab_Ddim_peak_med"     "lab_Ddim_peak_Q1"      "lab_Ddim_peak_Q3"     
## [13] "cohort_id"             "cohort_type"           "tot_cases_n"
## [1] "Column extracted from single cases:"
## [1] "lab_Ddim_NS"   "lab_Ddim_peak"

4.8.11 Sodium

## [1] "Column extracted from cohorts:"
## [1] "lab_sodium_NS_n"         "lab_sodium_NS_med"      
## [3] "lab_sodium_NS_Q1"        "lab_sodium_NS_Q3"       
## [5] "lab_sodium_baseline_n"   "lab_sodium_baseline_med"
## [7] "cohort_id"               "cohort_type"            
## [9] "tot_cases_n"
## [1] "Column extracted from single cases:"
## [1] "lab_sodium"

5 Case definitions

5.1 Lab reference values

Cut-offs in this study:

  • Neutrophilia > 8000/µL
  • Elevated CRP > 10 mg/L
  • Lymphopenia < 1250/µL
  • WBC > 11000/µL
  • Fibrinogen > 400 mg/dL
  • D-dimers > 250 ng/mL
  • Ferritin > 300 ng/mL
  • Albumin < 34 g/L
  • Procalcitonin > 0.49 ng/mL
  • LDH > 280 U/L
  • IL6 > 16.4 pg/mL
  • ESR > 22 mm/
  • BNP > 100 pg/mL
  • NTproBNP > 400 pg/mL
  • Troponin > 0.04 ng/mL

5.2 PIMS-TS

Source RCPCH

  1. A child presenting with persistent fever, inflammation (neutrophilia, elevated CRP and lymphopaenia) and evidence of single or multi-organ dysfunction (shock, cardiac, respiratory, renal, gastrointestinal or neurological disorder) with additional features (see listed in Appendix 1 ). This may include children fulfilling full or partial criteria for Kawasaki disease.
  2. Exclusion of any other microbial cause, including bacterial sepsis, staphylococcal or streptococcal shock syndromes, infections associated with myocarditis such as enterovirus (waiting for results of these investigations should not delay seeking expert advice).
  3. SARS-CoV-2 PCR testing may be positive or negative

We are unable to evaluate criteria 2.

PIMS_TS_fulfilled <- apply(df_singlecases, 1, function(row) {
    # persistent fever, inflammation (neutrophilia, elevated CRP and lymphopaenia) 
    pat_id <- row["patientID_int"]
    fever <- row["symp_fever"] == TRUE
    neutrophilia <- as.numeric(row["lab_neutrophils"]) > co_neutrophilia
    elevated_CRP <- (as.numeric(row["lab_CRP_admis"]) > co_CRP | as.numeric(row["lab_CRP_NS"]) > co_CRP | as.numeric(row["lab_CRP_peak"]) > co_CRP )
    lymphopenia <- as.numeric(row["lab_lymphocytes_lowest"]) < co_lympho
    inflamm <- any(fever, neutrophilia, elevated_CRP, lymphopenia)
    
    # lab values
    #fibrinogen <- row["lab_fibrino"] > co_fibrino
    #Ddimers <- row["lab_Ddim_peak"] > co_Ddim |  row["lab_Ddim_NS"] > co_Ddim
    #ferritin <- (row["lab_ferritin_NS"] > co_ferritin | row["lab_ferritin_admis"] > co_ferritin | row["lab_ferritin_peak"] > co_ferritin)
    #albumin <- row["lab_albumin_admis"] < co_albu | row["lab_albumin_lowest"] < co_albu | row["lab_albumin_NS"] < co_albu
    #lab_vals <- any(fibrinogen, Ddimers, ferritin, albumin)
    
    # single or multi-organ dysfunction (shock, cardiac, respiratory, renal, gastrointestinal or neurological disorder)
    pneumonia <- row["symp_resp_pneumonia"] == TRUE
    resp_failure <- row["symp_resp_failure"] == TRUE
    resp <- any(pneumonia, resp_failure)
    
    AKI <- row["symp_renal_AKI"] == TRUE
    RRT <- row["critcare_RRT"] == TRUE
    renal <- any(AKI, RRT)
    
    myocarditis <- row["symp_cardiovasc_myocard"] == TRUE
    pericarditis <- row["symp_cardiovasc_pericard"] == TRUE
    LVEF_under30 <- row["symp_cardiovasc_LV_less30"] == TRUE
    LVEF_30to55 <- row["symp_cardiovasc_LV_30to55"] == TRUE
    BNP <- (as.numeric(row["lab_BNP_admis"]) > co_BNP | as.numeric(row["lab_BNP_max"]) > co_BNP ) 
    NTproBNP <- as.numeric(row["lab_NTproBNP"]) > co_NTproBNP
    tropo <- as.numeric(row["lab_troponin_admis"]) > co_tropo
    shock <- row["symp_cardiovasc_shock"] == TRUE
    
    cardiovasc <- any(myocarditis, LVEF_under30, LVEF_30to55, NTproBNP, BNP, tropo, shock)
    
    rash <- row["kawasaki_exanthema"] == TRUE
    dermato <- any(rash)
    
    organ_dysfunc <- sum(resp, renal, cardiovasc, dermato, na.rm = TRUE) >= 1

    criteria_fulfilled <- (inflamm) & organ_dysfunc #&lab_vals
    #return(c(pat_id, "criteria1_inflamm" = inflamm, "criteria2_labvals" = lab_vals, "criteria3_organdysfunc" = organ_dysfunc, "criteria_fulfilled" = criteria_fulfilled))
    return(c(pat_id, "criteria1_inflamm" = inflamm, "criteria3_organdysfunc" = organ_dysfunc, "criteria_fulfilled" = criteria_fulfilled))
})

PIMS_TS_fulfilled <- PIMS_TS_fulfilled %>% t() %>% as_tibble()
PIMS_TS_fulfilled <- type_convert(PIMS_TS_fulfilled)
PIMS_TS_fulfilled_heatmap <- PIMS_TS_fulfilled
cols <- sapply(PIMS_TS_fulfilled_heatmap, is.logical)
PIMS_TS_fulfilled_heatmap[,cols] <- lapply(PIMS_TS_fulfilled_heatmap[,cols], as.numeric)
PIMS_TS_fulfilled_heatmap_melt <- PIMS_TS_fulfilled_heatmap %>% melt()
PIMS_TS_fulfilled_heatmap_melt[is.na(PIMS_TS_fulfilled_heatmap_melt)] <- 2

skim(PIMS_TS_fulfilled)
Data summary
Name PIMS_TS_fulfilled
Number of rows 95
Number of columns 4
_______________________
Column type frequency:
character 1
logical 3
________________________
Group variables None

Variable type: character

skim_variable n_missing complete_rate min max empty n_unique whitespace
patientID_int 0 1 9 10 0 95 0

Variable type: logical

skim_variable n_missing complete_rate mean count
criteria1_inflamm 0 1 1 TRU: 95
criteria3_organdysfunc 0 1 1 TRU: 95
criteria_fulfilled 0 1 1 TRU: 95

5.3 CDC MIS-C

Source CDC and UpToDate The case definition for MIS-C is:

  1. Age <21 years
  2. Clinical presentation consistent with MIS-C, including all of the following:
    • Fever
      • Documented fever >38.0°C (100.4°F) for ≥24 hours or
      • Report of subjective fever lasting ≥24 hours
    • Laboratory evidence of inflammation
    • Severe illness requiring hospitalization
    • Multisystem involvement
      • 2 or more organ systems involved
        • Cardiovascular (eg, shock, elevated troponin, elevated BNP, abnormal echocardiogram, arrhythmia)
        • Respiratory (eg, pneumonia, ARDS, pulmonary embolism)
        • Renal (eg, AKI, renal failure)
        • Neurologic (eg, seizure, stroke, aseptic meningitis)
        • Hematologic (eg, coagulopathy)
        • Gastrointestinal (eg, elevated liver enzymes, diarrhea, ileus, gastrointestinal bleeding)
        • Dermatologic (eg, erythroderma, mucositis, other rash)
  3. No alternative plausible diagnoses
  4. Recent or current SARS-CoV-2 infection or exposure
    • Any of the following:
    • Positive SARS-CoV-2 RT-PCR
    • Positive serology
    • Positive antigen test
    • COVID-19 exposure within the 4 weeks prior to the onset of symptoms
CDC_fulfilled <- apply(df_singlecases, 1, function(row) {
    # criteria 1
    criteria1 = TRUE
    
    # criteria 2
    pat_id <- row["patientID_int"]
    
    # fever?
    fever <- row["symp_fever"] == TRUE | row["kawasaki_fever"] == TRUE

    inflamm <- any(fever)
    
    # lab values evidence for inflammation
    neutrophilia <- as.numeric(row["lab_neutrophils"]) > co_neutrophilia
    elevated_CRP <- (as.numeric(row["lab_CRP_admis"]) > co_CRP | as.numeric(row["lab_CRP_NS"]) > co_CRP | as.numeric(row["lab_CRP_peak"]) > co_CRP )
    lymphopenia <- as.numeric(row["lab_lymphocytes_lowest"]) < co_lympho
    fibrinogen <- as.numeric(row["lab_fibrino"]) > co_fibrino
    Ddimers <- as.numeric(row["lab_Ddim_peak"]) > co_Ddim |  as.numeric(row["lab_Ddim_NS"]) > co_Ddim
    ferritin <- (as.numeric(row["lab_ferritin_NS"]) > co_ferritin | as.numeric(row["lab_ferritin_admis"]) > co_ferritin | as.numeric(row["lab_ferritin_peak"]) > co_ferritin)
    albumin <- as.numeric(row["lab_albumin_admis"]) < co_albu | as.numeric(row["lab_albumin_lowest"]) < co_albu | as.numeric(row["lab_albumin_NS"]) < co_albu
    PCT <- as.numeric(row["lab_PCT_admis"]) > co_PCT | as.numeric(row["lab_PCT_peak"]) > co_PCT | as.numeric(row["lab_PCT_NS"]) > co_PCT 
    LDH <- as.numeric(row["lab_LDH"]) > co_LDH
    IL6 <- as.numeric(row["lab_IL6"]) > co_IL6
    ESR <- as.numeric(row["lab_ESR"]) > co_ESR

    lab_vals <- any(neutrophilia, elevated_CRP, lymphopenia, fibrinogen, Ddimers, ferritin, albumin, PCT, LDH, IL6, ESR)
    
    # Ilness requiring hospitalisation
    ## used surrogate parameters for hosp
    hosp_ICU <- row["admis_hosp_days"] > 1 | row["admis_ICU_days"] > 1 | row["admis_PICU_admis"] == TRUE
    NIV <- row["critcare_NIV"] == TRUE | row["critcare_NIV_days"] > 1
    MV <- row["critcare_MV"] == TRUE | row["critcare_MV_days"] > 1
    inotrop <- row["critcare_inotrop"] == TRUE | row["critcare_inotrop_days"] > 1
    ECMO <- row["critcare_ECMO"] == TRUE 
    IVIg <- row["rx_IVIg_once"] == TRUE  |  row["rx_IVIg_multip"] == TRUE 
    biologicals <- row["rx_anakinra"] == TRUE | row["rx_tocilizumab"] == TRUE | row["rx_infliximab"] == TRUE | row["rx_antibiotics"] == TRUE | row["rx_plasma"] == TRUE | row["rx_remdesivir"] == TRUE 
    heparin <- row["rx_heparin"] == TRUE

    req_hosp <- any(hosp_ICU, NIV, MV, inotrop, ECMO, IVIg, biologicals, heparin)
    
    ## multisystem involvement >= 2
    ## respiratory
    pneumonia <- row["symp_resp_pneumonia"] == TRUE
    resp_failure <- row["symp_resp_failure"] == TRUE
    resp <- any(pneumonia, resp_failure)
    
    AKI <- row["symp_renal_AKI"] == TRUE
    RRT <- row["critcare_RRT"] == TRUE
    renal <- any(AKI, RRT)
    
    myocarditis <- row["symp_cardiovasc_myocard"] == TRUE
    pericarditis <- row["symp_cardiovasc_pericard"] == TRUE
    LVEF_under30 <- row["symp_cardiovasc_LV_less30"] == TRUE
    LVEF_30to55 <- row["symp_cardiovasc_LV_30to55"] == TRUE
    BNP <- (as.numeric(row["lab_BNP_admis"]) > co_BNP | as.numeric(row["lab_BNP_max"]) > co_BNP ) 
    NTproBNP <- as.numeric(row["lab_NTproBNP"]) > co_NTproBNP
    tropo <- as.numeric(row["lab_troponin_admis"]) > co_tropo
    shock <- row["symp_cardiovasc_shock"] == TRUE
    
    cardiovasc <- any(myocarditis, LVEF_under30, LVEF_30to55, NTproBNP, BNP, tropo, shock)
    
    rash <- row["kawasaki_exanthema"] == TRUE
    dermato <- any(rash)
    
    organ_dysfunc <- sum(resp, renal, cardiovasc, dermato, na.rm = TRUE) >= 2
    
    criteria2 <- sum(inflamm, lab_vals, req_hosp, organ_dysfunc, na.rm = TRUE) == 4
    # criteria 3
    ## not evaluable
    criteria3 = TRUE
    # criteria 4
    # COVID pos?
    PCR_pos <- row["covid_PCR_pos"] == TRUE
    stool_pos <- row["covid_PCR_stool_pos"] == TRUE
    closecontact <- row["covid_closecontact"] == TRUE
    IgA <- row["covid_IgA_pos"] == TRUE
    IgM <- row["covid_IgM_pos"] == TRUE    
    IgG <- row["covid_IgG_pos"] == TRUE    
    any_sero <- row["covid_sero_pos"] == TRUE
    
    criteria4 <- any(PCR_pos, stool_pos, closecontact, IgA, IgM, IgG, any_sero)
    
    if (FALSE %in% c(criteria1, criteria2, criteria3, criteria4)){
      criteria_fulfilled <- FALSE
    } else if (NA %in% c(criteria1, criteria2, criteria3, criteria4)){
      criteria_fulfilled <- NA
    } else if (sum(criteria1, criteria2, criteria3, criteria4, na.rm = TRUE) == 4){
      criteria_fulfilled <- TRUE
    }
    
    #criteria_fulfilled <- sum(criteria1, criteria2, criteria3, criteria4, na.rm = TRUE) == 4
    return(c(pat_id, "criteria1_age" = criteria1, "criteria2_clinical" = criteria2, "criteria3_noAlt" = criteria3, "criteria4_recentExposure" = criteria4, "criteria_fulfilled" = criteria_fulfilled))
})

CDC_fulfilled <- CDC_fulfilled %>% t() %>% as_tibble()
CDC_fulfilled <- type_convert(CDC_fulfilled)
CDC_fulfilled_heatmap <- CDC_fulfilled
cols <- sapply(CDC_fulfilled_heatmap, is.logical)
CDC_fulfilled_heatmap[,cols] <- lapply(CDC_fulfilled_heatmap[,cols], as.numeric)
CDC_fulfilled_heatmap_melt <- CDC_fulfilled_heatmap %>% melt()
CDC_fulfilled_heatmap_melt[is.na(CDC_fulfilled_heatmap_melt)] <- 2

skim(CDC_fulfilled)
Data summary
Name CDC_fulfilled
Number of rows 95
Number of columns 6
_______________________
Column type frequency:
character 1
logical 5
________________________
Group variables None

Variable type: character

skim_variable n_missing complete_rate min max empty n_unique whitespace
patientID_int 0 1 9 10 0 95 0

Variable type: logical

skim_variable n_missing complete_rate mean count
criteria1_age 0 1.00 1.00 TRU: 95
criteria2_clinical 0 1.00 0.69 TRU: 66, FAL: 29
criteria3_noAlt 0 1.00 1.00 TRU: 95
criteria4_recentExposure 9 0.91 1.00 TRU: 86
criteria_fulfilled 7 0.93 0.67 TRU: 59, FAL: 29

5.4 WHO case definition

Source UpToDate:

All 6 criteria must be met:

  1. Age 0 to 19 years
  2. Fever for ≥3 days
  3. Clinical signs of multisystem involvement (at least 2 of the following):
    • Rash, bilateral nonpurulent conjunctivitis, or mucocutaneous inflammation signs (oral, hands, or feet)
    • Hypotension or shock
    • Cardiac dysfunction, pericarditis, valvulitis, or coronary abnormalities (including echocardiographic findings or elevated troponin/BNP)
    • Evidence of coagulopathy (prolonged PT or PTT; elevated D-dimer)
    • Acute gastrointestinal symptoms (diarrhea, vomiting, or abdominal pain)
  4. Elevated markers of inflammation (eg, ESR, CRP, or procalcitonin)
  5. No other obvious microbial cause of inflammation, including bacterial sepsis and staphylococcal/streptococcal toxic shock syndromes
  6. Evidence of SARS-CoV-2 infection
    • Any of the following:
    • Positive SARS-CoV-2 RT-PCR
    • Positive serology
    • Positive antigen test
    • Contact with an individual with COVID-19
#row <- df_singlecases[87, ]
WHO_fulfilled <- apply(df_singlecases, 1, function(row) {
    pat_id <- row["patientID_int"]
    
    # criteria 1
    criteria1 = TRUE
    
    # criteria 2: fever?
    fever <- row["symp_fever"] == TRUE | row["kawasaki_fever"] == TRUE

    criteria2 <- any(fever)
    
    # criteria 3: clinical signs of multisystem involvement (at least 2)
    ## Rash, bilateral nonpurulent conjunctivitis, or mucocutaneous inflammation signs (oral, hands, or feet)
    rash <- row["kawasaki_exanthema"] == TRUE
    conjunctivitis <- row["kawasaki_conjunctivitis"] == TRUE
    mucocutaneaous <- row["kawasaki_mouth"] == TRUE | row["kawasaki_extremity"] == TRUE
    
    criteria3_a <- any(rash, conjunctivitis, mucocutaneaous)
    
    ## hypotension or shock
    shock <- row["symp_cardiovasc_shock"] == TRUE
    criteria3_b <- any(shock)
    
    ## cardiac dysfunction
    myocarditis <- row["symp_cardiovasc_myocard"] == TRUE
    pericarditis <- row["symp_cardiovasc_pericard"] == TRUE
    LVEF_under30 <- row["symp_cardiovasc_LV_less30"] == TRUE
    LVEF_30to55 <- row["symp_cardiovasc_LV_30to55"] == TRUE
    BNP <- (as.numeric(row["lab_BNP_admis"]) > co_BNP | as.numeric(row["lab_BNP_max"]) > co_BNP ) 
    NTproBNP <- as.numeric(row["lab_NTproBNP"]) > co_NTproBNP
    tropo <- as.numeric(row["lab_troponin_admis"]) > co_tropo
    coronary <- row["symp_cardiovasc_cordilat"] == TRUE | row["symp_cardiovasc_aneurysm"] == TRUE
    
    criteria3_c <- any(myocarditis, LVEF_under30, LVEF_30to55, NTproBNP, BNP, tropo, coronary)
    
    ## coagulopathy
    fibrinogen <- as.numeric(row["lab_fibrino"]) > co_fibrino
    Ddimers <- as.numeric(row["lab_Ddim_peak"]) > co_Ddim |  as.numeric(row["lab_Ddim_NS"]) > co_Ddim
    
    criteria3_d <- any(fibrinogen, Ddimers)
    
    ## acute GI symptoms
    GIsymp <- row["symp_GI_NS"] == TRUE | row["symp_GI_abdopain"] == TRUE | row["symp_GI_vomiting"] == TRUE | row["symp_GI_diarrh"] == TRUE | row["symp_GI_colitis"] == TRUE 
    
    criteria3_e <- any(GIsymp)
    
    criteria3 <- sum(criteria3_a, criteria3_b, criteria3_c, criteria3_d, criteria3_e, na.rm = TRUE) >= 2
      
    # criteria 4: Elevated markers of inflammation (eg, ESR, CRP, or procalcitonin)
    neutrophilia <- as.numeric(row["lab_neutrophils"]) > co_neutrophilia
    elevated_CRP <- (as.numeric(row["lab_CRP_admis"]) >= co_CRP) | (as.numeric(row["lab_CRP_NS"]) >= co_CRP) | (as.numeric(row["lab_CRP_peak"]) >= co_CRP )
  #  print(paste0(pat_id, elevated_CRP, row["lab_CRP_peak"]))
    lymphopenia <- as.numeric(row["lab_lymphocytes_lowest"]) < co_lympho

    ferritin <- (as.numeric(row["lab_ferritin_NS"]) > co_ferritin | as.numeric(row["lab_ferritin_admis"]) > co_ferritin | as.numeric(row["lab_ferritin_peak"]) > co_ferritin)
    albumin <- as.numeric(row["lab_albumin_admis"]) < co_albu | as.numeric(row["lab_albumin_lowest"]) < co_albu | as.numeric(row["lab_albumin_NS"]) < co_albu
    PCT <- as.numeric(row["lab_PCT_admis"]) > co_PCT | as.numeric(row["lab_PCT_peak"]) > co_PCT | as.numeric(row["lab_PCT_NS"]) > co_PCT 
    LDH <- as.numeric(row["lab_LDH"]) > co_LDH
    IL6 <- as.numeric(row["lab_IL6"]) > co_IL6
    ESR <- as.numeric(row["lab_ESR"]) > co_ESR

    criteria4 <- any(neutrophilia, elevated_CRP, lymphopenia, ferritin, albumin, PCT, LDH, IL6, ESR)

    # criteria 5: No other obvious microbial cause of inflammation
    criteria5 <- TRUE
    
    # criteria 6: COVID pos?
    PCR_pos <- row["covid_PCR_pos"] == TRUE
    stool_pos <- row["covid_PCR_stool_pos"] == TRUE
    closecontact <- row["covid_closecontact"] == TRUE
    IgA <- row["covid_IgA_pos"] == TRUE
    IgM <- row["covid_IgM_pos"] == TRUE    
    IgG <- row["covid_IgG_pos"] == TRUE    
    any_sero <- row["covid_sero_pos"] == TRUE
    
    criteria6 <- any(PCR_pos, stool_pos, closecontact, IgA, IgM, IgG, any_sero)
    
    if (NA %in% c(criteria1, criteria2, criteria3, criteria4, criteria5, criteria6)){
      criteria_fulfilled <- NA
    } else if (FALSE %in% c(criteria1, criteria2, criteria3, criteria4, criteria5, criteria6)){
      criteria_fulfilled <- FALSE
    } else if (sum(criteria1, criteria2, criteria3, criteria4, criteria5, criteria6, na.rm = TRUE) == 6){
      criteria_fulfilled <- TRUE
    } else {
      criteria_fulfilled <- FALSE
    }

    return(c(pat_id, "criteria1_age" = criteria1, "criteria2_fever" = criteria2, "criteria3_clinical" = criteria3, "criteria4_inflamm" = criteria4, "criteria5_noAlt" = criteria5, "criteria6_recentExposure" = criteria6, "criteria_fulfilled" = criteria_fulfilled))
})


WHO_fulfilled <- WHO_fulfilled %>% t() %>% as_tibble()
WHO_fulfilled <- type_convert(WHO_fulfilled)
WHO_fulfilled_heatmap <- WHO_fulfilled
cols <- sapply(WHO_fulfilled_heatmap, is.logical)
WHO_fulfilled_heatmap[,cols] <- lapply(WHO_fulfilled_heatmap[,cols], as.numeric)
WHO_fulfilled_heatmap_melt <- WHO_fulfilled_heatmap %>% melt()
WHO_fulfilled_heatmap_melt[is.na(WHO_fulfilled_heatmap_melt)] <- 2

skim(WHO_fulfilled)
Data summary
Name WHO_fulfilled
Number of rows 95
Number of columns 8
_______________________
Column type frequency:
character 1
logical 7
________________________
Group variables None

Variable type: character

skim_variable n_missing complete_rate min max empty n_unique whitespace
patientID_int 0 1 9 10 0 95 0

Variable type: logical

skim_variable n_missing complete_rate mean count
criteria1_age 0 1.00 1.00 TRU: 95
criteria2_fever 0 1.00 1.00 TRU: 95
criteria3_clinical 0 1.00 0.98 TRU: 93, FAL: 2
criteria4_inflamm 0 1.00 1.00 TRU: 95
criteria5_noAlt 0 1.00 1.00 TRU: 95
criteria6_recentExposure 9 0.91 1.00 TRU: 86
criteria_fulfilled 9 0.91 0.98 TRU: 84, FAL: 2

5.6 Summary

criteria_summary <- data.frame(PIMS_TS_fulfilled %>% select(criteria_fulfilled), CDC_fulfilled %>% select(criteria_fulfilled), WHO_fulfilled %>% select(criteria_fulfilled))
colnames(criteria_summary) <- c("PIMS-TS", "CDC", "WHO")

cols <- sapply(criteria_summary, is.logical)
criteria_summary[,cols] <- lapply(criteria_summary[,cols], as.numeric)

criteria_summary <- criteria_summary %>% melt() %>% 
                          group_by(variable) %>% 
                          summarise(fulfilled = sum(value == 1, na.rm = TRUE), not_fulfilled = sum(value == 0, na.rm = TRUE), not_evaluable = sum(is.na(value)))
criteria_summary$sum <- rowSums(criteria_summary[,-1])

criteria_summary_melt <- criteria_summary %>% melt()
colnames(criteria_summary_melt) <- c("center", "fulfilled", "count")

fill_bar <- ggplot(criteria_summary_melt %>% filter(fulfilled != 'sum'), aes(x = center, y = count, fill = fulfilled)) + 
      geom_bar(stat = "identity", position = "fill") + theme_bw() + 
      labs(y = "ratio", title = "Single cases meeting which criteria", subtitle = paste0("percent of total (n = ", max(criteria_summary_melt$count) ,")")) +
        scale_fill_manual(values = wes_palette("Royal1")[c(1,2,4)])

dodge_bar <- ggplot(criteria_summary_melt %>% filter(fulfilled != 'sum'), aes(x = center, y = count, fill = fulfilled)) + 
      geom_bar(stat = "identity", position = "dodge") + theme_bw() + 
      labs(y = "n", title = "Single cases meeting which criteria", subtitle = "absolute values") +
        scale_fill_manual(values = wes_palette("Royal1")[c(1,2,4)])

ggarrange(dodge_bar, fill_bar, legend = "bottom", common.legend = TRUE)

6 Association of case definition with outcome

A new variable ‘unfavourable course’ made, which contains the following:

  • symp_cardiovasc_cordilat
  • symp_cardiovasc_aneurysm
  • symp_cardiovasc_shock
  • outcome_death
  • critcare_MV
  • critcare_ECMO
  • critcare_RRT
  • critcare_inotrop
  • admis_PICU_admis

Mild presentation means all of the above are either 0 or NA.

A new variable ‘PICU candidate’ made, which contains the following:

  • symp_cardiovasc_shock
  • outcome_death
  • critcare_MV
  • critcare_ECMO
  • critcare_RRT
  • critcare_inotrop
  • admis_PICU_admis

Mild presentation means all of the above are either 0 or NA.

7 Final figures

7.1 Sex

var_cohort <- df_cohort %>% select(contains("sex") | ("cohort_id") | "tot_cases_n")
var_cohort$cohort_id <- paste0(var_cohort$cohort_id, " (n = ", var_cohort$tot_cases_n,")")
sex_f <- var_cohort %>% group_by(cohort_id) %>% summarize(prct = sex_f/tot_cases_n) %>%  mutate(sex = "female")
sex_m <- var_cohort %>% group_by(cohort_id) %>% summarize(prct = sex_m/tot_cases_n) %>% mutate(sex = "male")
sex_all <- rbind(sex_f, sex_m)

p_sex_cohort <- ggplot(sex_all, aes(y = cohort_id, x = prct, fill = sex)) + 
  geom_bar(stat = "identity", position = "fill") + 
  theme_bw() + labs(x = "") +  labs(y = "") +
  scale_fill_manual(values = wes_palette("Royal1")) + theme(legend.position = "top", legend.title=element_blank())+
  rremove("y.text") 

var_controls <- df_cohort_controls %>% filter(cohort_type == "control") %>% select(contains("sex") | ("cohort_id") | "tot_cases_n")
var_controls$cohort_id <- paste0(var_controls$cohort_id, " (n = ", var_controls$tot_cases_n,")")
sex_f <- var_controls %>% group_by(cohort_id) %>% summarize(prct = sex_f/tot_cases_n) %>% mutate(sex = "female")
sex_m <- var_controls %>% group_by(cohort_id) %>% summarize(prct = sex_m/tot_cases_n) %>% mutate(sex = "male")
sex_all <- rbind(sex_f, sex_m)

p_sex_controls <- ggplot(sex_all, aes(y = cohort_id, x = prct, fill = sex)) + 
  geom_bar(stat = "identity", position = "fill") + 
  theme_bw() + labs(x = "") + 
  scale_fill_manual(values = wes_palette("Royal1"))+
  theme(legend.position = "none")  + labs(y = "")+
  rremove("y.text") 

n_single <- df_singlecases %>% nrow()
var_single <- df_singlecases %>% select(contains("sex"))
var_single$sex_m <- ifelse(var_single$sex == "M", TRUE, FALSE)
var_single$sex_f <- ifelse(var_single$sex == "F", TRUE, FALSE)
cols <- sapply(var_single, is.logical)
var_single[,cols] <- lapply(var_single[,cols], as.numeric)
var_single <- colSums(var_single %>% select(-sex), na.rm = TRUE)
var_single <- var_single/nrow(df_singlecases)*100

sex_single <- data.frame(cohort_id = paste0("single cases (n = ", n_single_cases, ")"), prct = c(var_single["sex_m"], var_single["sex_f"]), sex = c("male", "female"))

p_sex_single <- ggplot(sex_single, aes(y = cohort_id, x = prct, fill = sex)) + 
  geom_bar(stat = "identity", position = "fill") + 
  theme_bw() + 
  scale_fill_manual(values = wes_palette("Royal1"))+
  theme(legend.position = "none") + labs(y = "", x = "Fraction")+ rremove("y.text") 

plot_sex <- plot_grid(p_sex_cohort, p_sex_controls, p_sex_single, align = "v", nrow = 3, rel_heights = c(2/3, 1/5, 1/3))
plot_sex

7.2 Age distribution

cohort_age <- df_cohort_controls %>% select(contains("cohort_id") | contains("age") | contains("cohort_type")  | contains("tot_cases_n"))
cohort_age$cohort_id <- paste0(cohort_age$cohort_id, " (n = ", cohort_age$tot_cases_n,")")
cohort_age$age_med_yrs <- as.numeric(cohort_age$age_med_yrs )
cohort_age$age_Q1_yrs <- as.numeric(cohort_age$age_Q1_yrs)
cohort_age$age_Q3_yrs <- as.numeric(cohort_age$age_Q3_yrs)
cohort_age$age_min_yrs <- as.numeric(cohort_age$age_min_yrs)
cohort_age$age_max_yrs <- as.numeric(cohort_age$age_max_yrs)

cohort_age$data_descr <- ifelse(!is.na(cohort_age$age_Q1_yrs) & is.na(cohort_age$age_min_yrs) , "IQR", 
                                ifelse(is.na(cohort_age$age_Q1_yrs) & !is.na(cohort_age$age_min_yrs), "range", 
                                       ifelse(!is.na(cohort_age$age_Q1_yrs) & !is.na(cohort_age$age_min_yrs), "IQR + range", "none")))

p_age_cohort <- ggplot(cohort_age %>% filter(cohort_type == "covid"), aes(y = cohort_id, x = age_med_yrs, col = data_descr)) + 
  geom_point(size = 4) + 
  geom_errorbar(aes(xmin=age_Q1_yrs, xmax=age_Q3_yrs), width=.8, position=position_dodge(.9)) +
  geom_errorbar(aes(xmin=age_min_yrs,  xmax=age_max_yrs), width=.2, position=position_dodge(.9)) +
  theme_bw() + lims(x = c(0,21)) + 
  labs(y = "", x = "", col = "bars") + theme(legend.position="top", legend.title=element_blank())+
  scale_color_manual(values = c(wes_palette("BottleRocket2")[1:3], wes_palette("BottleRocket1")[2]))

p_age_controls <- ggplot(cohort_age %>% filter(cohort_type != "covid"), aes(y = cohort_id, x = age_med_yrs, col = data_descr)) + 
  geom_point(size = 4) + 
  geom_errorbar(aes(xmin=age_Q1_yrs, xmax=age_Q3_yrs), width=.2, position=position_dodge(.9)) +
  geom_errorbar(aes(xmin=age_min_yrs,  xmax=age_max_yrs), width=.2, position=position_dodge(.9)) +
  theme_bw() + lims(x = c(0,21)) +
  labs(y = "", x = "", col = "bars") + theme(legend.position="none")+
  scale_color_manual(values = wes_palette("BottleRocket2")[1])

p_age_single <- ggplot(df_singlecases, aes(x = as.numeric(age), y = paste0("single cases (n = ", n_single,")"))) +
  geom_violin(fill = wes_palette("Darjeeling2")[4]) + 
  geom_boxplot(width=.3, fill = wes_palette("Darjeeling2")[1]) + 
  theme_bw() + geom_beeswarm(groupOnX=FALSE, alpha = 0.5) + lims(x = c(0,21)) + 
  labs(y = "", x = "Age (years)")

plot_age <- plot_grid(p_age_cohort, p_age_controls, p_age_single, align = "v", nrow = 3, rel_heights = c(2/3, 1/5, 1/3))
plot_age

7.3 Lab values

7.3.1 C-reactive protein

## [1] "Column extracted from cohorts:"
##  [1] "lab_CRP_baseline_n"   "lab_CRP_baseline_med" "lab_CRP_baseline_Q1" 
##  [4] "lab_CRP_baseline_Q3"  "lab_CRP_peak_n"       "lab_CRP_peak_med"    
##  [7] "lab_CRP_peak_Q1"      "lab_CRP_peak_Q3"      "lab_CRP_NS_n"        
## [10] "lab_CRP_NS_med"       "lab_CRP_NS_Q1"        "lab_CRP_NS_Q3"       
## [13] "cohort_id"            "cohort_type"          "tot_cases_n"
## [1] "Column extracted from single cases:"
## [1] "lab_CRP_admis" "lab_CRP_NS"    "lab_CRP_peak"

7.3.2 Ferritin

## [1] "Column extracted from cohorts:"
##  [1] "lab_ferritin_NS_n"         "lab_ferritin_NS_med"      
##  [3] "lab_ferritin_NS_Q1"        "lab_ferritin_NS_Q3"       
##  [5] "lab_ferritin_baseline_n"   "lab_ferritin_baseline_med"
##  [7] "lab_ferritin_peak_n"       "lab_ferritin_peak_med"    
##  [9] "lab_ferritin_peak_Q1"      "lab_ferritin_peak_Q3"     
## [11] "cohort_id"                 "cohort_type"              
## [13] "tot_cases_n"
## [1] "Column extracted from single cases:"
## [1] "lab_ferritin_NS"    "lab_ferritin_admis" "lab_ferritin_peak"

7.3.3 IL-6

Note: The cases from Pouletty et al are added to the single cases as they report on IL6 values.

## [1] "Column extracted from cohorts:"
##  [1] "lab_IL6_baseline_n"   "lab_IL6_baseline_med" "lab_IL6_baseline_Q1" 
##  [4] "lab_IL6_baseline_Q3"  "lab_IL6_NS_n"         "lab_IL6_NS_med"      
##  [7] "lab_IL6_NS_Q1"        "lab_IL6_NS_Q3"        "cohort_id"           
## [10] "cohort_type"          "tot_cases_n"
## [1] "Column extracted from single cases:"
## [1] "lab_IL6"

7.3.4 White blood cells

## [1] "Column extracted from cohorts:"
## [1] "lab_WBC_NS_n"         "lab_WBC_NS_med"       "lab_WBC_NS_Q1"       
## [4] "lab_WBC_NS_Q3"        "lab_WBC_baseline_n"   "lab_WBC_baseline_med"
## [7] "cohort_id"            "cohort_type"          "tot_cases_n"
## [1] "Column extracted from single cases:"
## [1] "lab_WBC_highest"

7.3.5 Lymphocytes

## [1] "Column extracted from cohorts:"
## [1] "lab_lympho_NS_n"         "lab_lympho_NS_med"      
## [3] "lab_lympho_NS_Q1"        "lab_lympho_NS_Q3"       
## [5] "lab_lympho_baseline_n"   "lab_lympho_baseline_med"
## [7] "cohort_id"               "cohort_type"            
## [9] "tot_cases_n"
## [1] "Column extracted from single cases:"
## [1] "lab_lymphocytes_lowest"

7.3.6 Troponin

## [1] "Column extracted from cohorts:"
##  [1] "lab_troponin_baseline_n"   "lab_troponin_baseline_med"
##  [3] "lab_troponin_baseline_Q1"  "lab_troponin_baseline_Q3" 
##  [5] "lab_troponin_peak_n"       "lab_troponin_peak_med"    
##  [7] "lab_troponin_peak_Q1"      "lab_troponin_peak_Q3"     
##  [9] "lab_troponin_NS_n"         "lab_troponin_NS_med"      
## [11] "lab_troponin_NS_Q1"        "lab_troponin_NS_Q3"       
## [13] "cohort_id"                 "cohort_type"              
## [15] "tot_cases_n"
## [1] "Column extracted from single cases:"
## [1] "lab_troponin_admis" "lab_troponin_max"

7.3.7 Platelets

## [1] "Column extracted from cohorts:"
##  [1] "lab_platelet_NS_n"         "lab_platelet_NS_med"      
##  [3] "lab_platelet_NS_Q1"        "lab_platelet_NS_Q3"       
##  [5] "lab_platelet_baseline_n"   "lab_platelet_baseline_med"
##  [7] "lab_platelet_lowest_n"     "lab_platelet_lowest_med"  
##  [9] "lab_platelet_lowest_Q1"    "lab_platelet_lowest_Q3"   
## [11] "cohort_id"                 "cohort_type"              
## [13] "tot_cases_n"
## [1] "Column extracted from single cases:"
## [1] "lab_platelets_NS"      "lab_platelets_highest" "lab_platelets_lowest"

7.3.8 D-dimers

## [1] "Column extracted from cohorts:"
##  [1] "lab_Ddim_baseline_n"   "lab_Ddim_baseline_med" "lab_Ddim_baseline_Q1" 
##  [4] "lab_Ddim_baseline_Q3"  "lab_Ddim_NS_n"         "lab_Ddim_NS_med"      
##  [7] "lab_Ddim_NS_Q1"        "lab_Ddim_NS_Q3"        "lab_Ddim_peak_n"      
## [10] "lab_Ddim_peak_med"     "lab_Ddim_peak_Q1"      "lab_Ddim_peak_Q3"     
## [13] "cohort_id"             "cohort_type"           "tot_cases_n"
## [1] "Column extracted from single cases:"
## [1] "lab_Ddim_NS"   "lab_Ddim_peak"

7.3.9 Sodium

## [1] "Column extracted from cohorts:"
## [1] "lab_sodium_NS_n"         "lab_sodium_NS_med"      
## [3] "lab_sodium_NS_Q1"        "lab_sodium_NS_Q3"       
## [5] "lab_sodium_baseline_n"   "lab_sodium_baseline_med"
## [7] "cohort_id"               "cohort_type"            
## [9] "tot_cases_n"
## [1] "Column extracted from single cases:"
## [1] "lab_sodium"

8 SessionInfo

## R version 3.6.3 (2020-02-29)
## Platform: x86_64-apple-darwin15.6.0 (64-bit)
## Running under: macOS Catalina 10.15.5
## 
## Matrix products: default
## BLAS:   /Library/Frameworks/R.framework/Versions/3.6/Resources/lib/libRblas.0.dylib
## LAPACK: /Library/Frameworks/R.framework/Versions/3.6/Resources/lib/libRlapack.dylib
## 
## locale:
## [1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8
## 
## attached base packages:
## [1] stats     graphics  grDevices utils     datasets  methods   base     
## 
## other attached packages:
##  [1] gdtools_0.2.1      wesanderson_0.3.6  see_0.5.1          UpSetR_1.4.0      
##  [5] skimr_2.1.1        psych_1.9.12.31    zoo_1.8-7          DT_0.13           
##  [9] naniar_0.5.2       cowplot_1.0.0      ggpubr_0.2.5       magrittr_1.5      
## [13] ggbeeswarm_0.6.0   ggExtra_0.9        gridExtra_2.3      ggrepel_0.8.2     
## [17] scales_1.1.1       RColorBrewer_1.1-2 broom_0.5.5        reshape2_1.4.3    
## [21] httr_1.4.1         readxl_1.3.1       forcats_0.5.0      stringr_1.4.0     
## [25] dplyr_0.8.5        purrr_0.3.4        readr_1.3.1        tidyr_1.0.2       
## [29] tibble_3.0.1       ggplot2_3.3.1      tidyverse_1.3.0   
## 
## loaded via a namespace (and not attached):
##  [1] nlme_3.1-144      fs_1.4.0          lubridate_1.7.4   insight_0.8.5    
##  [5] repr_1.1.0        tools_3.6.3       backports_1.1.7   R6_2.4.1         
##  [9] vipor_0.4.5       DBI_1.1.0         colorspace_1.4-1  withr_2.2.0      
## [13] tidyselect_1.1.0  mnormt_1.5-6      compiler_3.6.3    cli_2.0.2        
## [17] rvest_0.3.5       xml2_1.3.0        labeling_0.3      bayestestR_0.7.0 
## [21] ggridges_0.5.2    systemfonts_0.1.1 digest_0.6.25     svglite_1.2.3    
## [25] rmarkdown_2.1     base64enc_0.1-3   pkgconfig_2.0.3   htmltools_0.4.0  
## [29] highr_0.8         dbplyr_1.4.2      fastmap_1.0.1     htmlwidgets_1.5.1
## [33] rlang_0.4.6       rstudioapi_0.11   shiny_1.4.0.2     farver_2.0.3     
## [37] generics_0.0.2    jsonlite_1.6.1    crosstalk_1.1.0.1 parameters_0.8.0 
## [41] Rcpp_1.0.4        munsell_0.5.0     fansi_0.4.1       lifecycle_0.2.0  
## [45] visdat_0.5.3      stringi_1.4.6     yaml_2.2.1        plyr_1.8.6       
## [49] grid_3.6.3        parallel_3.6.3    promises_1.1.0    crayon_1.3.4     
## [53] miniUI_0.1.1.1    lattice_0.20-38   haven_2.2.0       hms_0.5.3        
## [57] knitr_1.28        pillar_1.4.4      ggsignif_0.6.0    effectsize_0.3.1 
## [61] reprex_0.3.0      glue_1.4.1        evaluate_0.14     modelr_0.1.6     
## [65] vctrs_0.3.0       httpuv_1.5.2      cellranger_1.1.0  gtable_0.3.0     
## [69] assertthat_0.2.1  xfun_0.12         mime_0.9          xtable_1.8-4     
## [73] later_1.0.0       beeswarm_0.2.3    ellipsis_0.3.1
LS0tCnRpdGxlOiAiTXVsdGlzeXN0ZW0gaW5mbGFtbWF0b3J5IHN5bmRyb21lIGluIGNoaWxkcmVuIHJlbGF0ZWQgdG8gQ09WSUQtMTk6IGEgc3lzdGVtYXRpYyByZXZpZXciCnN1YnRpdGxlOiAiRGF0YSBhbmFseXNpcyIKYXV0aG9yOiAiTGV2aSBIb3N0ZSwgUnViZW4gVmFuIFBhZW1lbCosIEZpbG9tZWVuIEhhZXJ5bmNrIgpkYXRlOiAiYHIgZm9ybWF0KFN5cy50aW1lKCksICclZCAlQiwgJVksICVIOiVNOiVTJylgIgpvdXRwdXQ6CiAgaHRtbF9kb2N1bWVudDoKICAgIGNvZGVfZm9sZGluZzogaGlkZQogICAgaGlnaGxpZ2h0OiBrYXRlCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcwogICAgdGhlbWU6IGNvc21vCiAgICB0b2M6IHllcwogICAgdG9jX2Zsb2F0OiB5ZXMKICAgIGRmX3ByaW50OiBwYWdlZAogICAgY29kZV9kb3dubG9hZDogdHJ1ZQogICAgZmlnX2NhcHRpb246IHllcwotLS0KCiMgSW50cm9kdWN0aW9uCkluIHRoaXMgUk1hcmtkb3duIGZpbGUsIHRoZSBkYXRhLWFuYWx5c2lzIGZvciB0aGUgbWFudXNjcmlwdCAiTXVsdGlzeXN0ZW0gaW5mbGFtbWF0b3J5IHN5bmRyb21lIGluIGNoaWxkcmVuIHJlbGF0ZWQgdG8gQ09WSUQtMTk6IGEgc3lzdGVtYXRpYyByZXZpZXciIGlzIGRlc2NyaWJlZC4gVGhlIGNvbXBsZXRlIGRhdGEtYW5hbHlzaXMgY2FuIGJlIHJlcHJvZHVjZWQgZnJvbSB0aGUgZGF0YSBjb2xsZWN0aW9uIHNoZWV0IChpbiAueGxzIGZvcm1hdCksIHByb3ZpZGVkIGluIHRoZSBzdXBwbGVtZW50YXJ5IGRhdGEuIAoKYGBge3Igc2V0dXAsIGluY2x1ZGU9VFJVRSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0V9CmtuaXRyOjpvcHRzX2NodW5rJHNldChjYWNoZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSkKb3B0aW9ucyhkaWdpdHMgPSAzKQpsaWJyYXJ5KHRpZHl2ZXJzZSkKcmVxdWlyZShyZWFkeGwpCnJlcXVpcmUoaHR0cikKcmVxdWlyZShyZXNoYXBlMikKcmVxdWlyZShicm9vbSkKcmVxdWlyZShSQ29sb3JCcmV3ZXIpCnJlcXVpcmUoc2NhbGVzKQpyZXF1aXJlKGdncmVwZWwpCnJlcXVpcmUoZ3JpZEV4dHJhKQpyZXF1aXJlKGdnRXh0cmEpCmxpYnJhcnkoZ2diZWVzd2FybSkKcmVxdWlyZShnZ3B1YnIpCmxpYnJhcnkoY293cGxvdCkKbGlicmFyeShuYW5pYXIpCnJlcXVpcmUoRFQpCnJlcXVpcmUoem9vKQpyZXF1aXJlKHBzeWNoKQpsaWJyYXJ5KHNraW1yKQpsaWJyYXJ5KFVwU2V0UikKbGlicmFyeShzZWUpCmxpYnJhcnkod2VzYW5kZXJzb24pCgpvcHRpb25zKHNjaXBlbj05OTkpCgpjb19oYiA8LSAxMgpjb19uZXV0cm9waGlsaWEgPC0gODAwMApjb19DUlAgPC0gMTAKY29fbHltcGhvIDwtIDEyNTAKY29fZmlicmlubyA8LSA0MDAKY29fRGRpbSA8LSAyNTAKY29fZmVycml0aW4gPC0gMzAwCmNvX2FsYnUgPC0gMzQKY29fUENUIDwtIDAuNDkKY29fTERIIDwtIDI4MApjb19JTDYgPC0gMTYuNApjb19FU1IgPC0gMjIKY29fQk5QIDwtIDEwMApjb19OVHByb0JOUCA8LSA0MDAKY29fdHJvcG8gPC0gNDAKY29fV0JDIDwtIDExMDAwCmNvX3BsYXRlbGV0IDwtIDE1MDAwMApjb19zb2RpdW0gPC0gMTM1CiNpbnB1dCA9IGRmX2NvaG9ydF9jb250cm9scwojZmluZCA9ICJtYXgiCiNwYXJhbSA9ICJDUlAiCgpjb2xsYXBzZV9sYWJ2YWxzX2NvaG9ydCA8LSBmdW5jdGlvbihpbnB1dCwgZmluZCwgcGFyYW0pewogIGlmIChmaW5kID09ICJtYXgiKXsKICAgIGRmIDwtIGlucHV0ICU+JSBzZWxlY3QoY29udGFpbnMocGFyYW0pIHwgY29udGFpbnMoImNvaG9ydF9pZCIpIHwgY29udGFpbnMoImNvaG9ydF90eXBlIikgfCBjb250YWlucygidG90X2Nhc2VzX24iKSkKICAgIHByaW50KCJDb2x1bW4gZXh0cmFjdGVkIGZyb20gY29ob3J0czoiKQogICAgcHJpbnQoY29sbmFtZXMoZGYpKQogICAgZGZfbWVkIDwtIGRmICU+JSBzZWxlY3QoY29udGFpbnMoIm1lZCIpKQogICAgZGZfbWVkIDwtIHR5cGVfY29udmVydChkZl9tZWQpCiAgICBkZl9tZWQgPC0gZGZfbWVkICU+JSBtdXRhdGVfYWxsKGZ1bnMocmVwbGFjZV9uYSguLCAtOTk5KSkpCiAgICMgY29sbmFtZXMoZGZfbWVkKVttYXguY29sKGRmX21lZCx0aWVzLm1ldGhvZD0iZmlyc3QiKV0KICAgIGRmX21lZCA8LSBkZl9tZWQgJT4lIG11dGF0ZShtZWQgPSBhcy5udW1lcmljKGFwcGx5KGRmX21lZCwgMSwgbWF4KSkpCiAgICAKICAgIGRmX21pbiA8LSBkZiAlPiUgc2VsZWN0KGNvbnRhaW5zKCJRMSIpKQogICAgZGZfbWluIDwtIHR5cGVfY29udmVydChkZl9taW4pCiAgICBkZl9taW4gPC0gZGZfbWluICU+JSBtdXRhdGVfYWxsKGZ1bnMocmVwbGFjZV9uYSguLCAwKSkpCiAgICAjY29sbmFtZXMoZGZfbWluKVttYXguY29sKGRmX21pbix0aWVzLm1ldGhvZD0iZmlyc3QiKV0KICAgIGRmX21pbiA8LSBkZl9taW4gJT4lIG11dGF0ZShtaW4gPSBhcy5udW1lcmljKGFwcGx5KGRmX21pbiwgMSwgbWF4KSkpCiAgICAKICAgIGRmX21heCA8LSBkZiAlPiUgc2VsZWN0KGNvbnRhaW5zKCJRMyIpKQogICAgZGZfbWF4IDwtIHR5cGVfY29udmVydChkZl9tYXgpCiAgICBkZl9tYXggPC0gZGZfbWF4ICU+JSBtdXRhdGVfYWxsKGZ1bnMocmVwbGFjZV9uYSguLCAwKSkpCiAgICAjY29sbmFtZXMoZGZfbWF4KVttYXguY29sKGRmX21heCx0aWVzLm1ldGhvZD0iZmlyc3QiKV0KICAgIGRmX21heCA8LSBkZl9tYXggJT4lIG11dGF0ZShtYXggPSBhcy5udW1lcmljKGFwcGx5KGRmX21heCwgMSwgbWF4KSkpCiAgICAKICAgIGRmX2Z1bGwgPC0gY2JpbmQoZGYgJT4lIHNlbGVjdChjb2hvcnRfaWQsIGNvaG9ydF90eXBlLCB0b3RfY2FzZXNfbiksIGRmX21lZCAlPiUgc2VsZWN0KG1lZCksIGRmX21pbiAlPiUgc2VsZWN0KG1pbiksIGRmX21heCAlPiUgc2VsZWN0KG1heCkpCiAgICBkZl9mdWxsW2RmX2Z1bGwgPT0gLTk5OV0gPC0gTkEKICAgIG5hbWVzKGRmX2Z1bGwpW25hbWVzKGRmX2Z1bGwpID09ICdtYXgnXSA8LSBwYXN0ZTAocGFyYW0sICJfbWF4IikKICAgIG5hbWVzKGRmX2Z1bGwpW25hbWVzKGRmX2Z1bGwpID09ICdtaW4nXSA8LSBwYXN0ZTAocGFyYW0sICJfbWluIikKICAgIG5hbWVzKGRmX2Z1bGwpW25hbWVzKGRmX2Z1bGwpID09ICdtZWQnXSA8LSBwYXN0ZTAocGFyYW0sICJfbWVkIikKICAgIGRmX2Z1bGwkZGF0YV9kZXNjciA8LSAiSVFSIgogICAgZGZfZnVsbCRjb2hvcnRfaWQgPC0gcGFzdGUwKGRmX2Z1bGwkY29ob3J0X2lkLCAiIChuID0gIiwgYXMuY2hhcmFjdGVyKGRmX2Z1bGwkdG90X2Nhc2VzX24pLCIpIikKICAgIHdyaXRlLmNzdihkZl9mdWxsLCBwYXN0ZTAoIi4vZGF0YS9jb2hvcnRfIiwgcGFyYW0sICIuY3N2IikpCiAgICBwcmludChkYXRhdGFibGUoZGZfZnVsbCwgY2FwdGlvbiA9IHBhc3RlMCgib3ZlcnZpZXcgb2YgIiwgcGFyYW0pKSkKICAgIHJldHVybihkZl9mdWxsKQogIH0KICAgIGVsc2UgaWYgKGZpbmQgPT0gIm1pbiIpewogICAgZGYgPC0gaW5wdXQgJT4lIHNlbGVjdChjb250YWlucyhwYXJhbSkgfCBjb250YWlucygiY29ob3J0X2lkIikgfCBjb250YWlucygiY29ob3J0X3R5cGUiKSB8IGNvbnRhaW5zKCJ0b3RfY2FzZXNfbiIpKQogICAgcHJpbnQoIkNvbHVtbiBleHRyYWN0ZWQgZnJvbSBjb2hvcnRzOiIpCiAgICBwcmludChjb2xuYW1lcyhkZikpCiAgICBkZl9tZWQgPC0gZGYgJT4lIHNlbGVjdChjb250YWlucygibWVkIikpCiAgICBkZl9tZWQgPC0gdHlwZV9jb252ZXJ0KGRmX21lZCkKICAgIGRmX21lZCA8LSBkZl9tZWQgJT4lIG11dGF0ZV9hbGwoZnVucyhyZXBsYWNlX25hKC4sIDFlNikpKQogICAjIGNvbG5hbWVzKGRmX21lZClbbWF4LmNvbChkZl9tZWQsdGllcy5tZXRob2Q9ImZpcnN0IildCiAgICBkZl9tZWQgPC0gZGZfbWVkICU+JSBtdXRhdGUobWVkID0gYXMubnVtZXJpYyhhcHBseShkZl9tZWQsIDEsIG1pbikpKQogICAgCiAgICBkZl9taW4gPC0gZGYgJT4lIHNlbGVjdChjb250YWlucygiUTEiKSkKICAgIGRmX21pbiA8LSB0eXBlX2NvbnZlcnQoZGZfbWluKQogICAgZGZfbWluIDwtIGRmX21pbiAlPiUgbXV0YXRlX2FsbChmdW5zKHJlcGxhY2VfbmEoLiwgMWU2KSkpCiAgICAjY29sbmFtZXMoZGZfbWluKVttYXguY29sKGRmX21pbix0aWVzLm1ldGhvZD0iZmlyc3QiKV0KICAgIGRmX21pbiA8LSBkZl9taW4gJT4lIG11dGF0ZShtaW4gPSBhcy5udW1lcmljKGFwcGx5KGRmX21pbiwgMSwgbWluKSkpCiAgICAKICAgIGRmX21heCA8LSBkZiAlPiUgc2VsZWN0KGNvbnRhaW5zKCJRMyIpKQogICAgZGZfbWF4IDwtIHR5cGVfY29udmVydChkZl9tYXgpCiAgICBkZl9tYXggPC0gZGZfbWF4ICU+JSBtdXRhdGVfYWxsKGZ1bnMocmVwbGFjZV9uYSguLCAxZTYpKSkKICAgICNjb2xuYW1lcyhkZl9tYXgpW21heC5jb2woZGZfbWF4LHRpZXMubWV0aG9kPSJmaXJzdCIpXQogICAgZGZfbWF4IDwtIGRmX21heCAlPiUgbXV0YXRlKG1heCA9IGFzLm51bWVyaWMoYXBwbHkoZGZfbWF4LCAxLCBtaW4pKSkKICAgIAogICAgZGZfZnVsbCA8LSBjYmluZChkZiAlPiUgc2VsZWN0KGNvaG9ydF9pZCwgY29ob3J0X3R5cGUsIHRvdF9jYXNlc19uKSwgZGZfbWVkICU+JSBzZWxlY3QobWVkKSwgZGZfbWluICU+JSBzZWxlY3QobWluKSwgZGZfbWF4ICU+JSBzZWxlY3QobWF4KSkKICAgIGRmX2Z1bGxbZGZfZnVsbCA9PSAxZTZdIDwtIE5BCiAgICBuYW1lcyhkZl9mdWxsKVtuYW1lcyhkZl9mdWxsKSA9PSAnbWF4J10gPC0gcGFzdGUwKHBhcmFtLCAiX21heCIpCiAgICBuYW1lcyhkZl9mdWxsKVtuYW1lcyhkZl9mdWxsKSA9PSAnbWluJ10gPC0gcGFzdGUwKHBhcmFtLCAiX21pbiIpCiAgICBuYW1lcyhkZl9mdWxsKVtuYW1lcyhkZl9mdWxsKSA9PSAnbWVkJ10gPC0gcGFzdGUwKHBhcmFtLCAiX21lZCIpCiAgICBkZl9mdWxsJGRhdGFfZGVzY3IgPC0gIklRUiIKICAgIGRmX2Z1bGwkY29ob3J0X2lkIDwtIHBhc3RlMChkZl9mdWxsJGNvaG9ydF9pZCwgIiAobiA9ICIsIGFzLmNoYXJhY3RlcihkZl9mdWxsJHRvdF9jYXNlc19uKSwiKSIpCiAgICB3cml0ZS5jc3YoZGZfZnVsbCwgcGFzdGUwKCIuL2RhdGEvY29ob3J0XyIsIHBhcmFtLCAiLmNzdiIpKQogICAgcHJpbnQoZGF0YXRhYmxlKGRmX2Z1bGwsIGNhcHRpb24gPSBwYXN0ZTAoIm92ZXJ2aWV3IG9mICIsIHBhcmFtKSkpCiAgICByZXR1cm4oZGZfZnVsbCkKICB9Cn0KCiNpbnB1dCA9IGRmX3NpbmdsZWNhc2VzCiNmaW5kID0gIm1heCIKI3BhcmFtID0gIkNSUCIKCmNvbGxhcHNlX2xhYnZhbHNfc2luZ2xlIDwtIGZ1bmN0aW9uKGlucHV0LCBmaW5kLCBwYXJhbSl7CiAgaWYgKGZpbmQgPT0gIm1heCIpewogICAgZGYgPC0gaW5wdXQgJT4lIHNlbGVjdChjb250YWlucyhwYXJhbSkgfCBjb250YWlucygiY29ob3J0X2lkIikpCiAgICBwcmludCgiQ29sdW1uIGV4dHJhY3RlZCBmcm9tIHNpbmdsZSBjYXNlczoiKQogICAgcHJpbnQoY29sbmFtZXMoZGYpKQogICAgZGZfY29sbCA8LSBkZiAlPiUgbXV0YXRlX2FsbChmdW5zKHJlcGxhY2VfbmEoLiwgLTk5OSkpKQogICAgZGZfY29sbCA8LSB0eXBlX2NvbnZlcnQoZGZfY29sbCkKICAgIyBjb2xuYW1lcyhkZl9tZWQpW21heC5jb2woZGZfbWVkLHRpZXMubWV0aG9kPSJmaXJzdCIpXQogICAgZGZfY29sbCA8LSBkZl9jb2xsICU+JSBtdXRhdGUobWF4ID0gYXMubnVtZXJpYyhhcHBseShkZl9jb2xsLCAxLCBtYXgpKSkKICAgIAogICAgZGZfY29sbFtkZl9jb2xsID09IC05OTldIDwtIE5BCiAgICBuYW1lcyhkZl9jb2xsKVtuYW1lcyhkZl9jb2xsKSA9PSAnbWF4J10gPC0gcGFzdGUwKHBhcmFtLCAiX21heCIpCiAgICBkZl9jb2xsJGRhdGFfZGVzY3IgPC0gIklRUiIKICAgIGRmX2NvbGwkY29ob3J0X2lkIDwtIHBhc3RlMCgic2luZ2xlIGNhc2VzIChuID0gIiwgYXMuY2hhcmFjdGVyKG5fc2luZ2xlX2Nhc2VzKSwiKSIpCiAgICB3cml0ZS5jc3Yoc2tpbShkZl9jb2xsKSwgcGFzdGUwKCIuL2RhdGEvc2luZ2xlY2FzZXNfIiwgcGFyYW0sICIuY3N2IikpCiAgICByZXR1cm4oZGZfY29sbCkKICB9CiAgICBlbHNlIGlmIChmaW5kID09ICJtaW4iKXsKICAgIGRmIDwtIGlucHV0ICU+JSBzZWxlY3QoY29udGFpbnMocGFyYW0pIHwgY29udGFpbnMoImNvaG9ydF9pZCIpKQogICAgcHJpbnQoIkNvbHVtbiBleHRyYWN0ZWQgZnJvbSBzaW5nbGUgY2FzZXM6IikKICAgIHByaW50KGNvbG5hbWVzKGRmKSkKICAgIGRmX2NvbGwgPC0gZGYgJT4lIG11dGF0ZV9hbGwoZnVucyhyZXBsYWNlX25hKC4sIDFlNikpKQogICAjIGNvbG5hbWVzKGRmX21lZClbbWF4LmNvbChkZl9tZWQsdGllcy5tZXRob2Q9ImZpcnN0IildCiAgICBkZl9jb2xsIDwtIGRmX2NvbGwgJT4lIG11dGF0ZShtaW4gPSBhcy5udW1lcmljKGFwcGx5KGRmX2NvbGwsIDEsIG1pbikpKQogICAgCiAgICBkZl9jb2xsW2RmX2NvbGwgPT0gMWU2XSA8LSBOQQogICAgbmFtZXMoZGZfY29sbClbbmFtZXMoZGZfY29sbCkgPT0gJ21pbiddIDwtIHBhc3RlMChwYXJhbSwgIl9taW4iKQogICAgZGZfY29sbCRjb2hvcnRfaWQgPC0gcGFzdGUwKCJzaW5nbGUgY2FzZXMgKG4gPSAiLCBhcy5jaGFyYWN0ZXIobl9zaW5nbGVfY2FzZXMpLCIpIikKICAgIHdyaXRlLmNzdihza2ltKGRmX2NvbGwpLCBwYXN0ZTAoIi4vZGF0YS9zaW5nbGVjYXNlc18iLCBwYXJhbSwgIi5jc3YiKSkKICAgIHJldHVybihkZl9jb2xsKQogIH0KfQoKCm1vdmVtZSA8LSBmdW5jdGlvbiAoZGYsIG1vdmVjb21tYW5kKSB7CiAgaW52ZWMgPC0gbmFtZXMoZGYpCiAgCiAgbW92ZWNvbW1hbmQgPC0gbGFwcGx5KHN0cnNwbGl0KHN0cnNwbGl0KG1vdmVjb21tYW5kLCAiOyIpW1sxXV0sIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLHxcXHMrIiksIGZ1bmN0aW9uKHgpIHhbeCAhPSAiIl0pCiAgbW92ZWxpc3QgPC0gbGFwcGx5KG1vdmVjb21tYW5kLCBmdW5jdGlvbih4KSB7CiAgICBXaGVyZSA8LSB4W3doaWNoKHggJWluJSBjKCJiZWZvcmUiLCAiYWZ0ZXIiLCAiZmlyc3QiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxhc3QiKSk6bGVuZ3RoKHgpXQogICAgVG9Nb3ZlIDwtIHNldGRpZmYoeCwgV2hlcmUpCiAgICBsaXN0KFRvTW92ZSwgV2hlcmUpCiAgfSkKICBteVZlYyA8LSBpbnZlYwogIGZvciAoaSBpbiBzZXFfYWxvbmcobW92ZWxpc3QpKSB7CiAgICB0ZW1wIDwtIHNldGRpZmYobXlWZWMsIG1vdmVsaXN0W1tpXV1bWzFdXSkKICAgIEEgPC0gbW92ZWxpc3RbW2ldXVtbMl1dWzFdCiAgICBpZiAoQSAlaW4lIGMoImJlZm9yZSIsICJhZnRlciIpKSB7CiAgICAgIGJhIDwtIG1vdmVsaXN0W1tpXV1bWzJdXVsyXQogICAgICBpZiAoQSA9PSAiYmVmb3JlIikgewogICAgICAgIGFmdGVyIDwtIG1hdGNoKGJhLCB0ZW1wKSAtIDEKICAgICAgfQogICAgICBlbHNlIGlmIChBID09ICJhZnRlciIpIHsKICAgICAgICBhZnRlciA8LSBtYXRjaChiYSwgdGVtcCkKICAgICAgfQogICAgfQogICAgZWxzZSBpZiAoQSA9PSAiZmlyc3QiKSB7CiAgICAgIGFmdGVyIDwtIDAKICAgIH0KICAgIGVsc2UgaWYgKEEgPT0gImxhc3QiKSB7CiAgICAgIGFmdGVyIDwtIGxlbmd0aChteVZlYykKICAgIH0KICAgIG15VmVjIDwtIGFwcGVuZCh0ZW1wLCB2YWx1ZXMgPSBtb3ZlbGlzdFtbaV1dW1sxXV0sIGFmdGVyID0gYWZ0ZXIpCiAgfQogIAogIGRmWyxtYXRjaChteVZlYywgbmFtZXMoZGYpKV0KfQoKbWFrZUJhcnBsb3QgPC0gZnVuY3Rpb24odmFyX2lkX2NvaG9ydCwgdmFyX2lkX3NpbmdsZSwgdmFyX2lkKXsKCiAgICAgICAgbl9jb2hvcnQgPC0gZGZfY29ob3J0ICU+JSBzZWxlY3QodG90X2Nhc2VzX24pICU+JSBzdW0oKSMsIG91dGNvbWVfZGVhdGhfbikKICAgICAgICB2YXJfY29ob3J0IDwtIGRmX2NvaG9ydFt2YXJfaWRfY29ob3J0XSAlPiUgc3VtKC4sIG5hLnJtID0gVFJVRSkjLCBvdXRjb21lX2RlYXRoX24pCiAgICAgICAgCiAgICAgICAgbl9zaW5nbGUgPC0gZGZfc2luZ2xlY2FzZXMgJT4lIG5yb3coKQogICAgICAgIAogICAgICAgIHZhcl9zaW5nbGUgPC0gZGZfc2luZ2xlY2FzZXMgJT4lIGZpbHRlcihnZXQodmFyX2lkX3NpbmdsZSkgPT0gVFJVRSkgJT4lIG5yb3coKQogICAgICAgIAogICAgICAgIG5fYWxsIDwtIG5fY29ob3J0ICsgbl9zaW5nbGUKICAgICAgICB2YXJfYWxsIDwtIHZhcl9jb2hvcnQgKyB2YXJfc2luZ2xlCiAgICAgICAgCiAgICAgICAgYmFyX2RmX2FicyA8LSBkYXRhLmZyYW1lKHggPSBjKCJjb2hvcnQiLCAiY29ob3J0IiwgInNpbmdsZSBjYXNlcyIsICJzaW5nbGUgY2FzZXMiLCAiYWxsIiwgImFsbCIpLCBjb2wgPSBjKCJ0b3RhbCIsIHZhcl9pZCwgInRvdGFsIiwgdmFyX2lkLCAidG90YWwiLCB2YXJfaWQpLCB2YWxzID0gYyhuX2NvaG9ydCwgdmFyX2NvaG9ydCwgbl9zaW5nbGUsIHZhcl9zaW5nbGUsIG5fYWxsLCB2YXJfYWxsKSApCiAgICAgICAgCiAgICAgICAgYmFyX2RmX3ByY3QgPC0gZGF0YS5mcmFtZSh4ID0gYygiY29ob3J0IiwgImNvaG9ydCIsICJzaW5nbGUgY2FzZXMiLCAic2luZ2xlIGNhc2VzIiwgImFsbCIsICJhbGwiKSwgY29sID0gYyhwYXN0ZTAodmFyX2lkLCAiIC0iKSwgcGFzdGUwKHZhcl9pZCwgIiArIiksIHBhc3RlMCh2YXJfaWQsICIgLSIpLCBwYXN0ZTAodmFyX2lkLCAiICsiKSwgcGFzdGUwKHZhcl9pZCwgIiAtIiksIHBhc3RlMCh2YXJfaWQsICIgKyIpKSwgdmFscyA9IGMoMTAwLSh2YXJfY29ob3J0L25fY29ob3J0KjEwMCksIHZhcl9jb2hvcnQvbl9jb2hvcnQqMTAwLCAxMDAtKHZhcl9zaW5nbGUvbl9zaW5nbGUqMTAwKSwgdmFyX3NpbmdsZS9uX3NpbmdsZSoxMDAsIDEwMC0odmFyX2FsbC9uX2FsbCoxMDApLCB2YXJfYWxsL25fYWxsKjEwMCkgKQoKICAgICAgICAKICAgICAgICBwX2FicyA8LSBnZ3Bsb3QoYmFyX2RmX2FicywgYWVzKHggPSB4LCB5ID0gIHZhbHMsIGZpbGwgPSBjb2wpKSArCiAgICAgICAgICAgIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJkb2RnZSIpICsKICAgICAgICAgICAgdGhlbWVfYncoKSArIAogICAgICAgICAgICBsYWJzKHRpdGxlID0gcGFzdGUwKCJUb3RhbCBjYXNlcyB2cyAiLCB2YXJfaWQpLCBzdWJ0aXRsZSA9ICJBYnNvbHV0ZSBudW1iZXJzIiwgeCA9ICJncm91cCIsIHkgPSAibiIsIGNvbCA9ICIiKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gd2VzX3BhbGV0dGUoIlJveWFsMSIpKQogICAgICAgIAogICAgICAgIAogICAgICAgIHBfcHJjdCA8LSBnZ3Bsb3QoYmFyX2RmX3ByY3QsIGFlcyh4ID0geCwgeSA9ICB2YWxzLCBmaWxsID0gY29sKSkgKwogICAgICAgICAgICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiZmlsbCIpICsKICAgICAgICAgICAgdGhlbWVfYncoKSArIAogICAgICAgICAgICBsYWJzKHRpdGxlID0gcGFzdGUwKHZhcl9pZCksIHN1YnRpdGxlID0gIlBlcmNlbnQiLCB4ID0gImdyb3VwIiwgeSA9ICIlIiwgY29sID0gIiIpICArCiAgICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50KSsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSB3ZXNfcGFsZXR0ZSgiUm95YWwxIikpCiAgICAgICAgCiAgICAgICAgZ2dhcnJhbmdlKHBfYWJzLCBwX3ByY3QsIGxlZ2VuZCA9ICJib3R0b20iKQogIAp9CgptYWtlSGVhdG1hcF9jb2hvcnQgPC0gZnVuY3Rpb24ocGFyYW0xLCBjb2xuYW1lX3NpbmdsZSwgZXhjbHVkZV9zaW5nbGUgPSBOVUxMLCBwbG90dGl0bGUsIHRleHRzaXplID0gMyl7CiAgdmFyX2NvaG9ydCA8LSBkZl9jb2hvcnQgJT4lIHNlbGVjdCgoImNvaG9ydF9pZCIpIHwgInRvdF9jYXNlc19uIiB8ICggY29udGFpbnMocGFyYW0xKSAmIGNvbnRhaW5zKCJfbiIpKSkKICB2YXJfY29ob3J0JGNvaG9ydF9pZCA8LSBwYXN0ZTAodmFyX2NvaG9ydCRjb2hvcnRfaWQsICIgKG4gPSAiLCBhcy5jaGFyYWN0ZXIodmFyX2NvaG9ydCR0b3RfY2FzZXNfbiksIikiKQogIHZhcl9jb2hvcnQgPC0gdmFyX2NvaG9ydCAlPiUgCiAgICBnYXRoZXIodmFyaWFibGUsIHZhbHVlLCAzOm5jb2wodmFyX2NvaG9ydCkpICU+JSBncm91cF9ieShjb2hvcnRfaWQsIHZhcmlhYmxlKSAlPiUgc3VtbWFyaXplKHByY3QgPSB2YWx1ZS90b3RfY2FzZXNfbioxMDApCiAgdmFyX2NvaG9ydCR2YXJpYWJsZSA8LSBzdWIoIl9uIiwgIiIsIHZhcl9jb2hvcnQkdmFyaWFibGUpCgppZiAoIWlzLm51bGwoZXhjbHVkZV9zaW5nbGUpKXsKICB2YXJfc2luZ2xlIDwtIGRmX3NpbmdsZWNhc2VzICU+JSBzZWxlY3QoLWNvbnRhaW5zKGV4Y2x1ZGVfc2luZ2xlKSkKICB2YXJfc2luZ2xlIDwtIHZhcl9zaW5nbGUgJT4lIHNlbGVjdChjb250YWlucyhjb2xuYW1lX3NpbmdsZSkpCn0gZWxzZQp7CiAgdmFyX3NpbmdsZSA8LSBkZl9zaW5nbGVjYXNlcyAlPiUgc2VsZWN0KGNvbnRhaW5zKGNvbG5hbWVfc2luZ2xlKSkKfQoKICMlPiUgc2VsZWN0KC1jb250YWlucygiYW55IikpCmNvbHMgPC0gc2FwcGx5KHZhcl9zaW5nbGUsIGlzLmxvZ2ljYWwpCnZhcl9zaW5nbGVbLGNvbHNdIDwtIGxhcHBseSh2YXJfc2luZ2xlWyxjb2xzXSwgYXMubnVtZXJpYykKdmFyX3NpbmdsZSA8LSBjb2xTdW1zKHZhcl9zaW5nbGUsIG5hLnJtID0gVFJVRSkKdmFyX3NpbmdsZSA8LSB2YXJfc2luZ2xlL25yb3coZGZfc2luZ2xlY2FzZXMpKjEwMAp2YXJfc2luZ2xlIDwtIGFzLmRhdGEuZnJhbWUodmFyX3NpbmdsZSkgJT4lIHJvd25hbWVzX3RvX2NvbHVtbigpCnZhcl9zaW5nbGUkY29ob3J0X2lkIDwtICJzaW5nbGVfY2FzZXMiCmNvbG5hbWVzKHZhcl9zaW5nbGUpIDwtIGMoInZhcmlhYmxlIiwgInByY3QiLCAiY29ob3J0X2lkIikKCgptaXNzaW5nIDwtIHNldGRpZmYodmFyX3NpbmdsZSR2YXJpYWJsZSwgdmFyX2NvaG9ydCR2YXJpYWJsZSkKaWYgKGxlbmd0aChtaXNzaW5nKSAhPSAwICl7CiAgbWlzc2luZ19kZiA8LSBkYXRhLmZyYW1lKHZhcmlhYmxlID0gbWlzc2luZywgcHJjdCA9IE5BLCBjb2hvcnRfaWQgPSB1bmlxdWUodmFyX2NvaG9ydCRjb2hvcnRfaWQpKQogIHZhcl9jb2hvcnQgPC0gYmluZF9yb3dzKHZhcl9jb2hvcnQsIGFzX3RpYmJsZShtaXNzaW5nX2RmKSkKfSBlbHNlIGlmIChsZW5ndGgobWlzc2luZykgPT0gMCkgewogIG1pc3NpbmcgPC0gc2V0ZGlmZih2YXJfY29ob3J0JHZhcmlhYmxlLCB2YXJfc2luZ2xlJHZhcmlhYmxlKQogIGlmIChsZW5ndGgobWlzc2luZykgIT0gMCl7CiAgbWlzc2luZ19kZiA8LSBkYXRhLmZyYW1lKHZhcmlhYmxlID0gbWlzc2luZywgcHJjdCA9IE5BLCBjb2hvcnRfaWQgPSB1bmlxdWUodmFyX3NpbmdsZSRjb2hvcnRfaWQpKQogIHZhcl9zaW5nbGUgPC0gYmluZF9yb3dzKHZhcl9zaW5nbGUsIGFzX3RpYmJsZShtaXNzaW5nX2RmKSkKICB9Cn0KCmhtX2NvaG9ydCA8LSBnZ3Bsb3QodmFyX2NvaG9ydCwgYWVzKHggPSB2YXJpYWJsZSwgeSA9IGNvaG9ydF9pZCwgZmlsbCA9IHByY3QpKSArIAogICAgZ2VvbV90aWxlKCkgKyB0aGVtZV9jbGFzc2ljKCkgKwogICAgdGhlbWUoYXhpcy50ZXh0Lng9ZWxlbWVudF9ibGFuaygpLCBheGlzLnRpY2tzLng9ZWxlbWVudF9ibGFuaygpLCBheGlzLmxpbmU9ZWxlbWVudF9ibGFuaygpKSsKICAgc2NhbGVfZmlsbF9ncmFkaWVudChsb3cgPSAieWVsbG93IiwgaGlnaD0icmVkIiwgbmEudmFsdWUgPSAibGlnaHRncmF5IiwgbGltaXRzID0gYygwLDEwMCkpICsKICAgIGxhYnMoeCA9ICIiLCB5ID0gImNvaG9ydCIsIHRpdGxlID1wbG90dGl0bGUpICsKICAgIGdlb21fdGV4dChhZXMobGFiZWw9cm91bmQocHJjdCwgMikpLCBzaXplID0gdGV4dHNpemUsIGNvbG9yID0gImJsYWNrIikKCmhtX3NpbmdsZSA8LSBnZ3Bsb3QodmFyX3NpbmdsZSwgYWVzKHggPSB2YXJpYWJsZSwgeSA9IGNvaG9ydF9pZCwgZmlsbCA9IHByY3QpKSArIAogICAgZ2VvbV90aWxlKCkgKyAgdGhlbWVfY2xhc3NpYygpICsKICAgIHRoZW1lKGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChhbmdsZT05MCwgaGp1c3Q9MSksIGF4aXMubGluZT1lbGVtZW50X2JsYW5rKCkpKwogICAgc2NhbGVfZmlsbF9ncmFkaWVudChsb3cgPSAieWVsbG93IiwgaGlnaCA9ICJyZWQiLCBuYS52YWx1ZSA9ICJsaWdodGdyYXkiLCBsaW1pdHMgPSBjKDAsMTAwKSkrIGxhYnMoeSA9ICJjb2hvcnQiKSArCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsPXJvdW5kKHByY3QsIDIpKSwgc2l6ZSA9IHRleHRzaXplLCBjb2xvciA9ICJibGFjayIpIAoKcGxvdF9ncmlkKGhtX2NvaG9ydCwgaG1fc2luZ2xlLCBhbGlnbiA9ICJ2IiwgbnJvdyA9IDIsIHJlbF9oZWlnaHRzID0gYygxLzIsIDEvMikpCn0KYGBgCgoKIyBEYXRhIGltcG9ydCBhbmQgY2xlYW5pbmcKIyMgU2luZ2xlIGNhc2VzCkZpcnN0LCB3ZSBpbXBvcnQgdGhlIHNpbmdsZSBjYXNlcyBmcm9tIHRoZSBnZW5lcmFsIGV4Y2VsIHNoZWV0IGFuZCB0cmFuc2Zvcm0gdGhlIGV4Y2VsIHNoZWV0IHNvIHRoYXQgdmFyaWFibGVzIGFyZSBjb2x1bW5zIGFuZCByb3dzIGFyZSBjYXNlcy4gQ29sdW1ucyB3aXRob3V0IGFueSB2YWx1ZXMgYXJlIGFsc28gcmVtb3ZlZC4gCgpUaGUgc2luZ2xlIGNhc2VzIGZyb20gUG91bGV0dHkgKDEwLjExMzYvYW5ucmhldW1kaXMtMjAyMC0yMTc5NjApIGFyZSBleGNsdWRlZCAoYXMgdGhleSBhcmUgaW5jbHVkZWQgaW4gdGhlIGNvaG9ydHMpLgoKCmBgYHtyfQpkZl9zaW5nbGVjYXNlcyA8LQogIHJlYWRfZXhjZWwoIi9Vc2Vycy9ybXZwYWVtZS9PbmVkcml2ZS9VR2VudC9QSU1TLVRTIFN5c3RlbWF0aWMgUmV2aWV3IC0gRGF0YSBleHRyYWN0aWUvZGF0YSBleHRyYWN0aWUueGxzeCIsCiAgICAgICAgICAgICBzaGVldCA9ICJTaW5nbGUgY2FzZXMiLAogICAgICAgICAgICAgc2tpcCA9IDEsCiAgICAgICAgICAgICBjb2xfbmFtZXMgPSBGQUxTRSlbLC1jKDE6MildCmRmX3NpbmdsZWNhc2VzIDwtIGRmX3NpbmdsZWNhc2VzICU+JSB0KCkKZGZfc2luZ2xlY2FzZXMgPC0gYXMuZGF0YS5mcmFtZShkZl9zaW5nbGVjYXNlcywgc3RyaW5nc0FzRmFjdG9ycyA9IEZBTFNFKQpubXMgPC0gYXMudmVjdG9yKGRmX3NpbmdsZWNhc2VzWzEsXSkKbm1zW2lzLm5hKG5tcyldIDwtICd0bXAnCmNvbG5hbWVzKGRmX3NpbmdsZWNhc2VzKSA8LSBtYWtlLnVuaXF1ZShhcy5jaGFyYWN0ZXIobm1zKSkKZGZfc2luZ2xlY2FzZXMgPC0gZGZfc2luZ2xlY2FzZXNbLTEsXQpkZl9zaW5nbGVjYXNlcyA8LSBkZl9zaW5nbGVjYXNlcyAlPiUgc2VsZWN0KC1jb250YWlucygidG1wIikpCmRmX3NpbmdsZWNhc2VzIDwtIGRmX3NpbmdsZWNhc2VzICU+JSBzZWxlY3QoLXZhcmlhYmxlX2lkKQoKZGZfc2luZ2xlY2FzZXMgPC0gZGZfc2luZ2xlY2FzZXMgJT4lIAogIG11dGF0ZV9hbGwoZnVucyhzdHJfcmVwbGFjZSguLCAiWWVzIiwgInllcyIpKSkKZGZfc2luZ2xlY2FzZXMgPC0gZGZfc2luZ2xlY2FzZXMgJT4lIAogIG11dGF0ZV9hbGwoZnVucyhzdHJfcmVwbGFjZSguLCAiTm8iLCAibm8iKSkpCmRmX3NpbmdsZWNhc2VzIDwtIGRmX3NpbmdsZWNhc2VzICU+JSAKICBtdXRhdGVfYWxsKGZ1bnMoc3RyX3JlcGxhY2UoLiwgInBvcyIsICJ5ZXMiKSkpCmRmX3NpbmdsZWNhc2VzIDwtIGRmX3NpbmdsZWNhc2VzICU+JSAKICBtdXRhdGVfYWxsKGZ1bnMoc3RyX3JlcGxhY2UoLiwgIm5lZyIsICJubyIpKSkKCmRmX3NpbmdsZWNhc2VzIDwtIGRmX3NpbmdsZWNhc2VzICU+JQogIHJlcGxhY2Vfd2l0aF9uYV9hbGwoY29uZGl0aW9uID0gfi54ID09ICJOQSIpCgpkZl9zaW5nbGVjYXNlcyA8LSB0eXBlX2NvbnZlcnQoZGZfc2luZ2xlY2FzZXMpCmRmX3NpbmdsZWNhc2VzX2luY2xQb3VsZXR0eSA8LSBkZl9zaW5nbGVjYXNlcwpkZl9zaW5nbGVjYXNlcyA8LSBkZl9zaW5nbGVjYXNlcyAlPiUgZmlsdGVyKGRvaSAhPSAiaHR0cHM6Ly8xMC4xMTM2L2FubnJoZXVtZGlzLTIwMjAtMjE3OTYwIikgICMgdGhlc2UgY2FzZXMgYXJlIGV4Y2x1ZGVkIGFjY29yZGluZyB0byB0aGUgZGF0YSBzaGVldAoKZGZfc2luZ2xlY2FzZXMgPC0gZGZfc2luZ2xlY2FzZXNbY29sU3VtcyghaXMubmEoZGZfc2luZ2xlY2FzZXMpKSA+IDBdCm5fc2luZ2xlX2Nhc2VzIDwtIG5yb3coZGZfc2luZ2xlY2FzZXMpCmBgYAoKIyMjIE1ha2luZyBzdW1tYXJ5IHN0YXRpc3RpY3MKCkluIHRoaXMgc2VjdGlvbiwgZGF0YSBpcyBzdW1tYXJpemVkLiBGb3IgZXhhbXBsZSwgaWYgdGhlcmUgYXJlIGFueSBjb21vcmJpZGl0aWVzIHByZXNlbnQsIGEgY29sdW1uICJjb21vcmJfYW55IiBpcyBhZGRlZCBhbmQgYW5ub3RhdGVkIGFzIFRSVUUuIFRoZSBzYW1lIGlzIGRvbmUgZm9yIENPVklEIHNlcm9sb2d5IGFuZCBzeW1wdG9tcyBvZiBtYWpvciBvcmdhbiAocmVzcGlyYXRvcnksIGNhcmRpb3Zhc2N1bGFyIGV0YykuCgpgYGB7cn0KZGZfc2luZ2xlY2FzZXMgPC0gZGZfc2luZ2xlY2FzZXMgJT4lIG11dGF0ZShjb21vcmJfYW55ID0gYXBwbHkoZGZfc2luZ2xlY2FzZXMgJT4lIHNlbGVjdChjb250YWlucygiY29tb3JiIikpLCAxLCBhbnkpKQpkZl9zaW5nbGVjYXNlcyA8LSBkZl9zaW5nbGVjYXNlcyAlPiUgbW92ZW1lKC4sICJjb21vcmJfYW55IGJlZm9yZSBjb21vcmJfY2FyZGlvdmFzYyIpCmBgYAoKSWYgSWdHLCBJZ0EsIElnTSBvciBDT1ZJRCBzZXJvbG9neSBpcyByZXBvcnRlZCBhcyBwb3NpdGl2ZSwgdGhlIGNvbHVtbiBjb3ZpZF9zZXJvX2FueSBpcyBhbm5vdGF0ZWQgYXMgVFJVRS4KCmBgYHtyfQpkZl9zaW5nbGVjYXNlcyA8LSBkZl9zaW5nbGVjYXNlcyAlPiUgbXV0YXRlKGNvdmlkX3Nlcm9fYW55ID0gYXBwbHkoZGZfc2luZ2xlY2FzZXMgJT4lIHNlbGVjdChjb3ZpZF9zZXJvX3BvcywgY292aWRfSWdBX3BvcywgY292aWRfSWdNX3BvcywgY292aWRfSWdHX3BvcyksIDEsIGFueSkpCgpkZl9zaW5nbGVjYXNlcyA8LSBkZl9zaW5nbGVjYXNlcyAlPiUgbW92ZW1lKC4sICJjb3ZpZF9zZXJvX2FueSBiZWZvcmUgY292aWRfc2Vyb19wb3MiKQpgYGAKCklmIFBDUissIHN0b29sIFBDUissIElnRywgSWdBLCBJZ00gb3IgQ09WSUQgc2Vyb2xvZ3kgaXMgcmVwb3J0ZWQgYXMgcG9zaXRpdmUsIHRoZSBjb2x1bW4gY292aWRfcG9zX2FueSBpcyBhbm5vdGF0ZWQgYXMgVFJVRS4KCmBgYHtyfQpkZl9zaW5nbGVjYXNlcyA8LSBkZl9zaW5nbGVjYXNlcyAlPiUgbXV0YXRlKGNvdmlkX3Bvc19hbnkgPSBhcHBseShkZl9zaW5nbGVjYXNlcyAlPiUgc2VsZWN0KGNvdmlkX1BDUl9wb3MsIGNvdmlkX1BDUl9zdG9vbF9wb3MsIGNvdmlkX3Nlcm9fcG9zLCBjb3ZpZF9JZ0FfcG9zLCBjb3ZpZF9JZ01fcG9zLCBjb3ZpZF9JZ0dfcG9zKSwgMSwgYW55KSkKCmRmX3NpbmdsZWNhc2VzIDwtIGRmX3NpbmdsZWNhc2VzICU+JSBtb3ZlbWUoLiwgImNvdmlkX3Bvc19hbnkgYmVmb3JlIGNvdmlkX3Nlcm9fYW55IikKYGBgCgpJZiBhbnkgcmVzcGlyYXRvcnkgc3ltcHRvbXMsIHN5bXBfcmVzcF9hbnkgaXMgYW5ub3RhdGVkIGFzIFRSVUUuCgpgYGB7cn0KZGZfc2luZ2xlY2FzZXMgPC0gZGZfc2luZ2xlY2FzZXMgJT4lIG11dGF0ZShzeW1wX3Jlc3BfYW55ID0gYXBwbHkoZGZfc2luZ2xlY2FzZXMgJT4lIHNlbGVjdChzeW1wX3Jlc3BfTlMsIHN5bXBfcmVzcF9VUlQsIHN5bXBfcmVzcF9keXNwbmVhLCBzeW1wX3Jlc3BfcG5ldW1vbmlhLCBzeW1wX3Jlc3BfZmFpbHVyZSwgc3ltcF9yZXNwX2NoZXN0cGFpbiksIDEsIGFueSkpCgpkZl9zaW5nbGVjYXNlcyA8LSBkZl9zaW5nbGVjYXNlcyAlPiUgbW92ZW1lKC4sICJzeW1wX3Jlc3BfYW55IGJlZm9yZSBzeW1wX3Jlc3BfTlMiKQpgYGAKCklmIGFueSBHSSBzeW1wdG9tcywgc3ltcF9HSV9hbnkgaXMgYW5ub3RhdGVkIGFzIFRSVUUuCgpgYGB7cn0KZGZfc2luZ2xlY2FzZXMgPC0gZGZfc2luZ2xlY2FzZXMgJT4lIG11dGF0ZShzeW1wX0dJX2FueSA9IGFwcGx5KGRmX3NpbmdsZWNhc2VzICU+JSBzZWxlY3QoY29udGFpbnMoInN5bXBfR0kiKSksIDEsIGFueSkpCgpkZl9zaW5nbGVjYXNlcyA8LSBkZl9zaW5nbGVjYXNlcyAlPiUgbW92ZW1lKC4sICJzeW1wX0dJX2FueSBiZWZvcmUgc3ltcF9HSV9OUyIpCmBgYAoKSWYgYW55IG5ldXJvbG9naWNhbCBzeW1wdG9tcywgc3ltcF9uZXVyb19hbnkgaXMgYW5ub3RhdGVkIGFzIFRSVUUuCgpgYGB7cn0KZGZfc2luZ2xlY2FzZXMgPC0gZGZfc2luZ2xlY2FzZXMgJT4lIG11dGF0ZShzeW1wX25ldXJvX2FueSA9IGFwcGx5KGRmX3NpbmdsZWNhc2VzICU+JSBzZWxlY3Qoc3ltcF9uZXVyb19oZWFkYWNoZSxzeW1wX25ldXJvX21lbmluZ2l0aXMsc3ltcF9uZXVyb19tZW5pbmdpc20sc3ltcF9uZXVyb19hc3RoZW5pYSxzeW1wX25ldXJvX2lycml0YWIpLCAxLCBhbnkpKQoKZGZfc2luZ2xlY2FzZXMgPC0gZGZfc2luZ2xlY2FzZXMgJT4lIG1vdmVtZSguLCAic3ltcF9uZXVyb19hbnkgYmVmb3JlIHN5bXBfbmV1cm9fR0NTIikKYGBgCgpJZiBhbnkgcmVuYWwgc3ltcHRvbXMsIHN5bXBfcmVuYWxfYW55IGlzIGFubm90YXRlZCBhcyBUUlVFLgoKYGBge3J9CmRmX3NpbmdsZWNhc2VzIDwtIGRmX3NpbmdsZWNhc2VzICU+JSBtdXRhdGUoc3ltcF9yZW5hbF9hbnkgPSBhcHBseShkZl9zaW5nbGVjYXNlcyAlPiUgc2VsZWN0KHN5bXBfcmVuYWxfQUtJKSwgMSwgYW55KSkKCmRmX3NpbmdsZWNhc2VzIDwtIGRmX3NpbmdsZWNhc2VzICU+JSBtb3ZlbWUoLiwgInN5bXBfcmVuYWxfYW55IGJlZm9yZSBzeW1wX3JlbmFsX0FLSSIpCmBgYAoKSWYgYW55IGNhcmRpb3Zhc2N1bGFyIHN5bXB0b21zLCBzeW1wX2NhcmRpb3Zhc2NfYW55IGlzIGFubm90YXRlZCBhcyBUUlVFLgoKYGBge3J9CmRmX3NpbmdsZWNhc2VzIDwtIGRmX3NpbmdsZWNhc2VzICU+JSBtdXRhdGUoc3ltcF9jYXJkaW92YXNjX2FueSA9IGFwcGx5KGRmX3NpbmdsZWNhc2VzICU+JSBzZWxlY3Qoc3ltcF9jYXJkaW92YXNjX215b2NhcmQsCnN5bXBfY2FyZGlvdmFzY19wZXJpY2FyZCwKc3ltcF9jYXJkaW92YXNjX2NvcmRpbGF0LApzeW1wX2NhcmRpb3Zhc2NfYW5ldXJ5c20sCnN5bXBfY2FyZGlvdmFzY19zaG9jaywKc3ltcF9jYXJkaW92YXNjX3RhY2h5Y2FyZCwKc3ltcF9jYXJkaW92YXNjX2Fycmh5dCksIDEsIGFueSkpCgpkZl9zaW5nbGVjYXNlcyA8LSBkZl9zaW5nbGVjYXNlcyAlPiUgbW92ZW1lKC4sICJzeW1wX2NhcmRpb3Zhc2NfYW55IGJlZm9yZSBzeW1wX2NhcmRpb3Zhc2NfbXlvY2FyZCIpCgp3cml0ZS5jc3YoZGZfc2luZ2xlY2FzZXMsIHBhc3RlMCgiLi9kYXRhL2RmX3NpbmdsZWNhc2VzLmNzdiIpKQoKZGF0YXRhYmxlKGRmX3NpbmdsZWNhc2VzLCBjYXB0aW9uID0gIlNpbmdsZSBjYXNlcyBkYXRhZnJhbWUiKQoKYGBgCgojIyBDb2hvcnRzCkFmdGVyd2FyZHMsIHdlIGRvIHRoZSBzYW1lIGZvciB0aGUgY29ob3J0IHNoZWV0LgoKVGhlIHBhcGVycyBieSBHcmltYXVkIGV0IGFsLiBhbmQgVmVyZG9uaSBldCBhbC4gYXJlIHJlbW92ZWQgZnJvbSB0aGUgY29ob3J0IGRhdGFmcmFtZSwgYXMgbW9zdCBpbmZvcm1hdGlvbiBpcyBwcmVzZW50IGluIHRoZSBzaW5nbGUgY2FzZXMgZGF0YWZyYW1lLiAKYGBge3J9CmRmX2NvaG9ydCA8LQogIHJlYWRfZXhjZWwoIi9Vc2Vycy9ybXZwYWVtZS9PbmVkcml2ZS9VR2VudC9QSU1TLVRTIFN5c3RlbWF0aWMgUmV2aWV3IC0gRGF0YSBleHRyYWN0aWUvZGF0YSBleHRyYWN0aWUueGxzeCIsCiAgICAgICAgICAgICBzaGVldCA9ICJDb2hvcnRzIiwKICAgICAgICAgICAgIHNraXAgPSAxLAogICAgICAgICAgICAgY29sX25hbWVzID0gRkFMU0UpWywtYygxOjMpXQoKCmRmX2NvaG9ydCA8LSBkZl9jb2hvcnQgJT4lIHQoKQpkZl9jb2hvcnQgPC0gYXMuZGF0YS5mcmFtZShkZl9jb2hvcnQsIHN0cmluZ3NBc0ZhY3RvcnMgPSBGQUxTRSkKbm1zIDwtIGFzLnZlY3RvcihkZl9jb2hvcnRbMSxdKQpubXNbaXMubmEobm1zKV0gPC0gJ3RtcCcKY29sbmFtZXMoZGZfY29ob3J0KSA8LSBtYWtlLnVuaXF1ZShhcy5jaGFyYWN0ZXIobm1zKSkKZGZfY29ob3J0IDwtIGRmX2NvaG9ydFstMSxdCmRmX2NvaG9ydCA8LSBkZl9jb2hvcnQgJT4lIHNlbGVjdCgtY29udGFpbnMoInRtcCIpKQpkZl9jb2hvcnQgPC0gZGZfY29ob3J0ICU+JSBzZWxlY3QoLXZhcmlhYmxlX2lkKQoKZGZfY29ob3J0IDwtIGRmX2NvaG9ydCAlPiUgCiAgbXV0YXRlX2FsbChmdW5zKHN0cl9yZXBsYWNlKC4sICJZZXMiLCAieWVzIikpKQpkZl9jb2hvcnQgPC0gZGZfY29ob3J0ICU+JSAKICBtdXRhdGVfYWxsKGZ1bnMoc3RyX3JlcGxhY2UoLiwgIk5vIiwgIm5vIikpKQpkZl9jb2hvcnQgPC0gZGZfY29ob3J0ICU+JSAKICBtdXRhdGVfYWxsKGZ1bnMoc3RyX3JlcGxhY2UoLiwgInBvcyIsICJ5ZXMiKSkpCmRmX2NvaG9ydCA8LSBkZl9jb2hvcnQgJT4lIAogIG11dGF0ZV9hbGwoZnVucyhzdHJfcmVwbGFjZSguLCAibmVnIiwgIm5vIikpKQoKZGZfY29ob3J0IDwtIGRmX2NvaG9ydCAlPiUKICByZXBsYWNlX3dpdGhfbmFfYWxsKGNvbmRpdGlvbiA9IH4ueCA9PSAiTkEiKQoKZGZfY29ob3J0IDwtIHR5cGVfY29udmVydChkZl9jb2hvcnQpCgpkZl9jb2hvcnQgPC0gZGZfY29ob3J0W2NvbFN1bXMoIWlzLm5hKGRmX2NvaG9ydCkpID4gMF0KCmRmX2NvaG9ydCA8LSBkZl9jb2hvcnQgJT4lIGZpbHRlcihkb2kgIT0gImh0dHBzOi8vZG9pLm9yZy8xMC4xMTg2L3MxMzYxMy0wMjAtMDA2OTAtOCIpICU+JSBmaWx0ZXIoZG9pICE9ICJodHRwczovL2RvaS5vcmcvMTAuMTAxNi9TMDE0MC02NzM2KDIwKTMxMTAzLVgiKQoKZGZfY29ob3J0X2NvbnRyb2xzIDwtIGRmX2NvaG9ydAoKZGZfY29ob3J0IDwtIGRmX2NvaG9ydCAlPiUgZmlsdGVyKGNvaG9ydF90eXBlID09ICJjb3ZpZCIpCgp3cml0ZS5jc3YoZGZfY29ob3J0LCBwYXN0ZTAoIi4vZGF0YS9kZl9jb2hvcnQuY3N2IikpCgpkYXRhdGFibGUoZGZfY29ob3J0LCBjYXB0aW9uID0gIkNvaG9ydCBkYXRhZnJhbWUiKQpgYGAKCgoKIyBEZXNjcmlwdGl2ZSBzdGF0aXN0aWNzIHsudGFic2V0fQojIyBHZW5lcmFsCgoKKipDbGljayBvbiB0aGUgYW55IG9mIHRoZSB0YWJzIGFib3ZlIHRvIHNlZSBkZXNjcmlwdGl2ZSBzdGF0aXN0aWNzIGZvciBldmVyeSB2YXJpYWJsZSoqICAgICAgCgoKCiMjIFNpbmdsZSBjYXNlcwoqKkhvdyB0byByZWFkKiogIApVbmRlciAiVmFyaWFibGUgdHlwZTogbG9naWNhbCIsIHRoZSBudW1iZXIgb2YgdHJ1ZS9mYWxzZXMgYXJlIGRlcGljdGVkLiBFLmcuIGF0IHRoZSB0b3Agd2UgY2FuIHNlZSB0aGF0IHRoZXJlIGFyZSA5NSBudW1iZXIgb2Ygcm93cyAoPSA5NSBwYXRpZW50cykuIE92ZXJ3ZWlnaHQgaGFzIDc5IG1pc3NpbmcgdmFsdWVzICgxNyUgaXMgY29tcGxldGUpLCB3aGljaCBtZWFucyB0aGF0IDk1LTc5PTE2IHBhdGllbnRzIGhhdmUgZWl0aGVyICJUUlVFIiBvciAiRkFMU0UiIGZvciBvdmVyd2VpZ2h0LiBPZiB0aGVzZSAxNiwgOSBhcmUgbWFya2VkIGFzICJUUlVFIiBmb3Igb3ZlcndlaWdodC4gCgogPGEgaHJlZj0iI3RvcCI+RG93bmxvYWQgZGF0YSBhcyAuY3N2IG9uIEdpdGh1YjwvYT4KCmBgYHtyfQpza2ltKGRmX3NpbmdsZWNhc2VzKQp3cml0ZS5jc3Yoc2tpbShkZl9zaW5nbGVjYXNlcyksIHBhc3RlMCgiLi9kYXRhL3NpbmdsZWNhc2VzX2Rlc2NyaXB0aXZlc3RhdHMuY3N2IikpCmBgYAoKIyMgQ29ob3J0cwoqKkhvdyB0byByZWFkKiogIApUaGUgc3VtIGNvbHVtbiBlcXVhbHMgdGhlIHN1bSBvZiBhbGwgaW5kaXZpZHVhbHMsIGUuZy4gc3VtKHRvdF9jYXNlc19uKSBtZWFucyB0aGF0IHRoZXJlIGFyZSA1OTIgcGF0aWVudHMgaW4gdG90YWwgaW4gdGhlIGNvaG9ydHM7IHN1bShvdXRjb21lX2RlYXRoX24pIG1lYW5zIHRoYXQgOSBwYXRpZW50cyBkaWVkLiAKClRoZSAiUHJjdF90b3RhbCIgY29sdW1uIGlzIHRoZSBwZXJjZW50YWdlIG9mIGUuZy4gZGVhdGggKDkvNTkyKS4gT25seSBtYWtlcyBzZW5zZSB3aGVyZSBuIGlzIHJlcG9ydGVkIGUuZy4gdGhlcmFweSAobm90IGZvciBsYWIgdmFsdWVzKS4KCmBgYHtyfQpza2ltc3VtIDwtIHNraW1fd2l0aChudW1lcmljID0gc2ZsKHN1bSA9IH4gc3VtKC4sIG5hLnJtID0gVFJVRSksIFByY3RfdG90YWwgPSB+IHN1bSguLCBuYS5ybSA9IFRSVUUpL3N1bShkZl9jb2hvcnQkdG90X2Nhc2VzX24pKjEwMCksIGFwcGVuZCA9IFRSVUUpCnNraW1zdW0oZGZfY29ob3J0KQp3cml0ZS5jc3Yoc2tpbXN1bShkZl9jb2hvcnQpLCBwYXN0ZTAoIi4vZGF0YS9jb2hvcnRfZGVzY3JpcHRpdmVzdGF0cy5jc3YiKSkKYGBgCgojIyBIaXN0b3JpY2FsIGNvbnRyb2xzCmBgYHtyfQpkZl9jb2hvcnRfY29udHJvbHNfc3RhdHMgPC0gZGZfY29ob3J0X2NvbnRyb2xzICU+JSBmaWx0ZXIoY29ob3J0X3R5cGUgPT0gImNvbnRyb2wiKQpkZl9jb2hvcnRfY29udHJvbHNfc3RhdHMgPC0gZGZfY29ob3J0X2NvbnRyb2xzX3N0YXRzW2NvbFN1bXMoIWlzLm5hKGRmX2NvaG9ydF9jb250cm9sc19zdGF0cykpID4gMF0Kc2tpbXN1bSA8LSBza2ltX3dpdGgobnVtZXJpYyA9IHNmbChzdW0gPSB+IHN1bSguLCBuYS5ybSA9IFRSVUUpLCBQcmN0X3RvdGFsID0gfiBzdW0oLiwgbmEucm0gPSBUUlVFKS9zdW0oZGZfY29ob3J0X2NvbnRyb2xzX3N0YXRzJHRvdF9jYXNlc19uKSoxMDApLCBhcHBlbmQgPSBUUlVFKQpza2ltc3VtKGRmX2NvaG9ydF9jb250cm9sc19zdGF0cykKCndyaXRlLmNzdihza2ltc3VtKGRmX2NvaG9ydF9jb250cm9sc19zdGF0cyksIHBhc3RlMCgiLi9kYXRhL2hpc3RvcmljYWxjb250cm9sc19kZXNjcmlwdGl2ZXN0YXRzLmNzdiIpKQoKd3JpdGUuY3N2KGRmX2NvaG9ydF9jb250cm9sc19zdGF0cywgcGFzdGUwKCIuL2RhdGEvZGZfY29ob3J0X2NvbnRyb2xzX3N0YXRzLmNzdiIpKQpgYGAKCgojIERhdGEgZXhwbG9yYXRpb24KIyMgVG90YWwgY2FzZXMgYW5kIGRlYXRocwpgYGB7cn0KI3Zhcl9pZF9jb2hvcnQgPSAib3V0Y29tZV9kZWF0aF9uIgojdmFyX2lkX3NpbmdsZSA9ICJvdXRjb21lX2RlYXRoIgojdmFyX2lkID0gImRlYXRocyIKbWFrZUJhcnBsb3QoIm91dGNvbWVfZGVhdGhfbiIsICJvdXRjb21lX2RlYXRoIiwgImRlYXRocyIpCmBgYAoKIyMgU2V4CmBgYHtyfQpuX2NvaG9ydCA8LSBkZl9jb2hvcnQgJT4lIHNlbGVjdCh0b3RfY2FzZXNfbikgJT4lIHN1bSgpCnZhcl9jb2hvcnQgPC0gZGZfY29ob3J0ICU+JSBzZWxlY3QoY29udGFpbnMoInNleCIpKQp2YXJfY29ob3J0IDwtIGNvbFN1bXModmFyX2NvaG9ydCwgbmEucm0gPSBUUlVFKQp2YXJfY29ob3J0IDwtIHZhcl9jb2hvcnQvc3VtKGRmX2NvaG9ydCR0b3RfY2FzZXNfbikqMTAwCnZhcl9jb2hvcnRbInNleF9uYSJdIDwtICgxMDAgLSB2YXJfY29ob3J0WyJzZXhfbSJdIC0gdmFyX2NvaG9ydFsic2V4X2YiXSkKCnZhcl9jb250cm9sIDwtIGRmX2NvaG9ydF9jb250cm9scyAlPiUgZmlsdGVyKGNvaG9ydF9pZCA9PSAiUG91bGV0dHkgLSBjb250cm9sIikgJT4lIHNlbGVjdChjb250YWlucygic2V4IikpCnZhcl9jb250cm9sIDwtIGNvbFN1bXModmFyX2NvbnRyb2wsIG5hLnJtID0gVFJVRSkKdmFyX2NvbnRyb2wgPC0gdmFyX2NvbnRyb2wvc3VtKGRmX2NvaG9ydF9jb250cm9scyAlPiUgZmlsdGVyKGNvaG9ydF9pZCA9PSAiUG91bGV0dHkgLSBjb250cm9sIikgJT4lIHNlbGVjdCh0b3RfY2FzZXNfbikpKjEwMAp2YXJfY29udHJvbFsic2V4X25hIl0gPC0gKDEwMCAtIHZhcl9jb250cm9sWyJzZXhfbSJdIC0gdmFyX2NvbnRyb2xbInNleF9mIl0pCgpuX3NpbmdsZSA8LSBkZl9zaW5nbGVjYXNlcyAlPiUgbnJvdygpCnZhcl9zaW5nbGUgPC0gZGZfc2luZ2xlY2FzZXMgJT4lIHNlbGVjdChjb250YWlucygic2V4IikpCnZhcl9zaW5nbGUkc2V4X20gPC0gaWZlbHNlKHZhcl9zaW5nbGUkc2V4ID09ICJNIiwgVFJVRSwgRkFMU0UpCnZhcl9zaW5nbGUkc2V4X2YgPC0gaWZlbHNlKHZhcl9zaW5nbGUkc2V4ID09ICJGIiwgVFJVRSwgRkFMU0UpCmNvbHMgPC0gc2FwcGx5KHZhcl9zaW5nbGUsIGlzLmxvZ2ljYWwpCnZhcl9zaW5nbGVbLGNvbHNdIDwtIGxhcHBseSh2YXJfc2luZ2xlWyxjb2xzXSwgYXMubnVtZXJpYykKdmFyX3NpbmdsZSA8LSBjb2xTdW1zKHZhcl9zaW5nbGUgJT4lIHNlbGVjdCgtc2V4KSwgbmEucm0gPSBUUlVFKQp2YXJfc2luZ2xlIDwtIHZhcl9zaW5nbGUvbnJvdyhkZl9zaW5nbGVjYXNlcykqMTAwCnZhcl9zaW5nbGVbInNleF9uYSJdIDwtICgxMDAgLSB2YXJfc2luZ2xlWyJzZXhfbSJdIC0gdmFyX3NpbmdsZVsic2V4X2YiXSkKCmJhcl9kZl9wcmN0IDwtIGRhdGEuZnJhbWUoCiAgeCA9IGMoIm1hbGVzIiwgImZlbWFsZXMiLCAibWlzc2luZyIsICJtYWxlcyIsICJmZW1hbGVzIiwgIm1pc3NpbmciLCAibWFsZXMiLCAiZmVtYWxlcyIsICJtaXNzaW5nIiksCiAgdmFscyA9IGModmFyX3NpbmdsZSwgdmFyX2NvaG9ydCwgdmFyX2NvbnRyb2wpLAogIGNvbCA9IGMocmVwKCJzaW5nbGUiLCBsZW5ndGgodmFyX3NpbmdsZSkpLCByZXAoImNvaG9ydHMiLCBsZW5ndGgodmFyX2NvaG9ydCkpLCByZXAoImhpc3RvciBjdHJsIiwgbGVuZ3RoKHZhcl9jb250cm9sKSkKKSkKCnBfcHJjdCA8LSBnZ3Bsb3QoYmFyX2RmX3ByY3QsIGFlcyh4ID0gY29sLCB5ID0gIHZhbHMsIGZpbGwgPSB4KSkgKwogICAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gInN0YWNrIikgKwogICAgdGhlbWVfYncoKSArIAogICAgbGFicyh0aXRsZSA9ICJNYWxlL2ZlbWFsZSBkaXN0cmlidXRpb24gaW4gZGF0YXNldCIsIHN1YnRpdGxlID0gIlByY3QiLCB4ID0gInNleCIsIHkgPSAiJSIsIGNvbCA9ICIgIikgICsgbGltcyh5ID0gYygwLDEwMCkpICsgdGhlbWUoYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KGFuZ2xlPTkwLCBoanVzdD0xKSkrCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gd2VzX3BhbGV0dGUoIlJveWFsMSIpKQpwX3ByY3QKYGBgCgoKYGBge3J9CnZhcl9jb2hvcnQgPC0gZGZfY29ob3J0ICU+JSBzZWxlY3QoY29udGFpbnMoInNleCIpIHwgKCJjb2hvcnRfaWQiKSB8ICJ0b3RfY2FzZXNfbiIpCnNleF9mIDwtIHZhcl9jb2hvcnQgJT4lIGdyb3VwX2J5KGNvaG9ydF9pZCkgJT4lIHN1bW1hcml6ZShwcmN0ID0gc2V4X2YvdG90X2Nhc2VzX24pICU+JSAgbXV0YXRlKHNleCA9ICJmZW1hbGUiKQpzZXhfbSA8LSB2YXJfY29ob3J0ICU+JSBncm91cF9ieShjb2hvcnRfaWQpICU+JSBzdW1tYXJpemUocHJjdCA9IHNleF9tL3RvdF9jYXNlc19uKSAlPiUgbXV0YXRlKHNleCA9ICJtYWxlIikKc2V4X2FsbCA8LSByYmluZChzZXhfZiwgc2V4X20pCgpwX3NleF9jb2hvcnQgPC0gZ2dwbG90KHNleF9hbGwsIGFlcyh5ID0gY29ob3J0X2lkLCB4ID0gcHJjdCwgZmlsbCA9IHNleCkpICsgCiAgICAgICAgICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiZmlsbCIpICsgCiAgICAgICAgICB0aGVtZV9idygpICsgbGFicyh4ID0gIiIpICsgCiAgICAgICAgICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSB3ZXNfcGFsZXR0ZSgiUm95YWwxIikpCgp2YXJfY29udHJvbHMgPC0gZGZfY29ob3J0X2NvbnRyb2xzICU+JSBmaWx0ZXIoY29ob3J0X2lkID09ICJQb3VsZXR0eSAtIGNvbnRyb2wiKSAlPiUgc2VsZWN0KGNvbnRhaW5zKCJzZXgiKSB8ICgiY29ob3J0X2lkIikgfCAidG90X2Nhc2VzX24iKQpzZXhfZiA8LSB2YXJfY29udHJvbHMgJT4lIGdyb3VwX2J5KGNvaG9ydF9pZCkgJT4lIHN1bW1hcml6ZShwcmN0ID0gc2V4X2YvdG90X2Nhc2VzX24pICU+JSBtdXRhdGUoc2V4ID0gImZlbWFsZSIpCnNleF9tIDwtIHZhcl9jb250cm9scyAlPiUgZ3JvdXBfYnkoY29ob3J0X2lkKSAlPiUgc3VtbWFyaXplKHByY3QgPSBzZXhfbS90b3RfY2FzZXNfbikgJT4lIG11dGF0ZShzZXggPSAibWFsZSIpCnNleF9hbGwgPC0gcmJpbmQoc2V4X2YsIHNleF9tKQoKcF9zZXhfY29udHJvbHMgPC0gZ2dwbG90KHNleF9hbGwsIGFlcyh5ID0gY29ob3J0X2lkLCB4ID0gcHJjdCwgZmlsbCA9IHNleCkpICsgCiAgICAgICAgICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiZmlsbCIpICsgCiAgICAgICAgICB0aGVtZV9idygpICsgbGFicyh4ID0gIiIpICsgCiAgICAgICAgICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSB3ZXNfcGFsZXR0ZSgiUm95YWwxIikpCgpuX3NpbmdsZSA8LSBkZl9zaW5nbGVjYXNlcyAlPiUgbnJvdygpCnZhcl9zaW5nbGUgPC0gZGZfc2luZ2xlY2FzZXMgJT4lIHNlbGVjdChjb250YWlucygic2V4IikpCnZhcl9zaW5nbGUkc2V4X20gPC0gaWZlbHNlKHZhcl9zaW5nbGUkc2V4ID09ICJNIiwgVFJVRSwgRkFMU0UpCnZhcl9zaW5nbGUkc2V4X2YgPC0gaWZlbHNlKHZhcl9zaW5nbGUkc2V4ID09ICJGIiwgVFJVRSwgRkFMU0UpCmNvbHMgPC0gc2FwcGx5KHZhcl9zaW5nbGUsIGlzLmxvZ2ljYWwpCnZhcl9zaW5nbGVbLGNvbHNdIDwtIGxhcHBseSh2YXJfc2luZ2xlWyxjb2xzXSwgYXMubnVtZXJpYykKdmFyX3NpbmdsZSA8LSBjb2xTdW1zKHZhcl9zaW5nbGUgJT4lIHNlbGVjdCgtc2V4KSwgbmEucm0gPSBUUlVFKQp2YXJfc2luZ2xlIDwtIHZhcl9zaW5nbGUvbnJvdyhkZl9zaW5nbGVjYXNlcykqMTAwCgpzZXhfc2luZ2xlIDwtIGRhdGEuZnJhbWUoY29ob3J0X2lkID0gInNpbmdsZV9jYXNlcyIsIHByY3QgPSBjKHZhcl9zaW5nbGVbInNleF9tIl0sIHZhcl9zaW5nbGVbInNleF9mIl0pLCBzZXggPSBjKCJtYWxlIiwgImZlbWFsZSIpKQoKcF9zZXhfc2luZ2xlIDwtIGdncGxvdChzZXhfc2luZ2xlLCBhZXMoeSA9IGNvaG9ydF9pZCwgeCA9IHByY3QsIGZpbGwgPSBzZXgpKSArIAogICAgICAgICAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gImZpbGwiKSArIAogICAgICAgICAgdGhlbWVfYncoKSArIAogICAgICAgICAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gd2VzX3BhbGV0dGUoIlJveWFsMSIpKQoKYSA8LSBwbG90X2dyaWQocF9zZXhfY29ob3J0LCBwX3NleF9jb250cm9scywgcF9zZXhfc2luZ2xlLCBhbGlnbiA9ICJ2IiwgbnJvdyA9IDMsIHJlbF9oZWlnaHRzID0gYyg1LzcsIDEvNywgMS83KSkKYQpgYGAKCiMjIEFnZSBkaXN0cmlidXRpb24KCmBgYHtyfQpjb2hvcnRfYWdlIDwtIGRmX2NvaG9ydF9jb250cm9scyAlPiUgc2VsZWN0KGNvbnRhaW5zKCJjb2hvcnRfaWQiKSB8IGNvbnRhaW5zKCJhZ2UiKSB8IGNvbnRhaW5zKCJjb2hvcnRfdHlwZSIpICB8IGNvbnRhaW5zKCJ0b3RfY2FzZXNfbiIpKQpjb2hvcnRfYWdlJGNvaG9ydF9pZCA8LSBwYXN0ZTAoY29ob3J0X2FnZSRjb2hvcnRfaWQsICIgKG4gPSAiLCBjb2hvcnRfYWdlJHRvdF9jYXNlc19uLCIpIikKY29ob3J0X2FnZSRhZ2VfbWVkX3lycyA8LSBhcy5udW1lcmljKGNvaG9ydF9hZ2UkYWdlX21lZF95cnMgKQpjb2hvcnRfYWdlJGFnZV9RMV95cnMgPC0gYXMubnVtZXJpYyhjb2hvcnRfYWdlJGFnZV9RMV95cnMpCmNvaG9ydF9hZ2UkYWdlX1EzX3lycyA8LSBhcy5udW1lcmljKGNvaG9ydF9hZ2UkYWdlX1EzX3lycykKY29ob3J0X2FnZSRhZ2VfbWluX3lycyA8LSBhcy5udW1lcmljKGNvaG9ydF9hZ2UkYWdlX21pbl95cnMpCmNvaG9ydF9hZ2UkYWdlX21heF95cnMgPC0gYXMubnVtZXJpYyhjb2hvcnRfYWdlJGFnZV9tYXhfeXJzKQoKY29ob3J0X2FnZSRkYXRhX2Rlc2NyIDwtIGlmZWxzZSghaXMubmEoY29ob3J0X2FnZSRhZ2VfUTFfeXJzKSAmIGlzLm5hKGNvaG9ydF9hZ2UkYWdlX21pbl95cnMpICwgIklRUiIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShpcy5uYShjb2hvcnRfYWdlJGFnZV9RMV95cnMpICYgIWlzLm5hKGNvaG9ydF9hZ2UkYWdlX21pbl95cnMpLCAicmFuZ2UiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKCFpcy5uYShjb2hvcnRfYWdlJGFnZV9RMV95cnMpICYgIWlzLm5hKGNvaG9ydF9hZ2UkYWdlX21pbl95cnMpLCAiYm90aCIsICJub25lIikpKQoKcF9hZ2VfY29ob3J0IDwtIGdncGxvdChjb2hvcnRfYWdlICU+JSBmaWx0ZXIoY29ob3J0X3R5cGUgPT0gImNvdmlkIiksIGFlcyh5ID0gY29ob3J0X2lkLCB4ID0gYWdlX21lZF95cnMsIGNvbCA9IGRhdGFfZGVzY3IpKSArIAogICAgICAgIGdlb21fcG9pbnQoc2l6ZSA9IDQpICsgCiAgICAgICAgZ2VvbV9lcnJvcmJhcihhZXMoeG1pbj1hZ2VfUTFfeXJzLCB4bWF4PWFnZV9RM195cnMpLCB3aWR0aD0uOCwgcG9zaXRpb249cG9zaXRpb25fZG9kZ2UoLjkpKSArCiAgICAgICAgZ2VvbV9lcnJvcmJhcihhZXMoeG1pbj1hZ2VfbWluX3lycywgIHhtYXg9YWdlX21heF95cnMpLCB3aWR0aD0uMiwgcG9zaXRpb249cG9zaXRpb25fZG9kZ2UoLjkpKSArCiAgICAgICAgdGhlbWVfYncoKSArIGxpbXMoeCA9IGMoMCwyMSkpICsgCiAgICAgICAgbGFicyh5ID0gImNvaG9ydCIsIHggPSAiIiwgY29sID0gImJhcnMiKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0idG9wIikrCiAgICAgICAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMod2VzX3BhbGV0dGUoIkJvdHRsZVJvY2tldDIiKVsxOjNdLCB3ZXNfcGFsZXR0ZSgiQm90dGxlUm9ja2V0MSIpWzJdKSkKCnBfYWdlX2NvbnRyb2xzIDwtIGdncGxvdChjb2hvcnRfYWdlICU+JSBmaWx0ZXIoY29ob3J0X3R5cGUgIT0gImNvdmlkIiksIGFlcyh5ID0gY29ob3J0X2lkLCB4ID0gYWdlX21lZF95cnMsIGNvbCA9IGRhdGFfZGVzY3IpKSArIAogICAgICAgIGdlb21fcG9pbnQoc2l6ZSA9IDQpICsgCiAgICAgICAgZ2VvbV9lcnJvcmJhcihhZXMoeG1pbj1hZ2VfUTFfeXJzLCB4bWF4PWFnZV9RM195cnMpLCB3aWR0aD0uMiwgcG9zaXRpb249cG9zaXRpb25fZG9kZ2UoLjkpKSArCiAgICAgICAgZ2VvbV9lcnJvcmJhcihhZXMoeG1pbj1hZ2VfbWluX3lycywgIHhtYXg9YWdlX21heF95cnMpLCB3aWR0aD0uMiwgcG9zaXRpb249cG9zaXRpb25fZG9kZ2UoLjkpKSArCiAgICAgICAgdGhlbWVfYncoKSArIGxpbXMoeCA9IGMoMCwyMSkpICsKICAgICAgICBsYWJzKHkgPSAiY29ob3J0IiwgeCA9ICIiLCBjb2wgPSAiYmFycyIpICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIikrCiAgICAgICAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IHdlc19wYWxldHRlKCJCb3R0bGVSb2NrZXQyIilbMl0pCgpwX2FnZV9zaW5nbGUgPC0gZ2dwbG90KGRmX3NpbmdsZWNhc2VzLCBhZXMoeCA9IGFzLm51bWVyaWMoYWdlKSwgeSA9IHBhc3RlMCgic2luZ2xlIGNhc2VzIChuID0gIiwgbl9zaW5nbGUsIikiKSkpICsKICAgICAgZ2VvbV92aW9saW4oZmlsbCA9IHdlc19wYWxldHRlKCJEYXJqZWVsaW5nMiIpWzRdKSArIAogICAgICBnZW9tX2JveHBsb3Qod2lkdGg9LjMsIGZpbGwgPSB3ZXNfcGFsZXR0ZSgiRGFyamVlbGluZzIiKVsxXSkgKyAKICAgICAgdGhlbWVfYncoKSArIGdlb21fYmVlc3dhcm0oZ3JvdXBPblg9RkFMU0UsIGFscGhhID0gMC41KSArIGxpbXMoeCA9IGMoMCwyMSkpICsgCiAgICAgIGxhYnMoeSA9ICJjb2hvcnQiLCB4ID0gIkFnZSAoeWVhcnMpIikKCmEgPC0gcGxvdF9ncmlkKHBfYWdlX2NvaG9ydCwgcF9hZ2VfY29udHJvbHMsIHBfYWdlX3NpbmdsZSwgYWxpZ24gPSAidiIsIG5yb3cgPSAzLCByZWxfaGVpZ2h0cyA9IGMoMi8zLCAxLzUsIDEvMykpCmEKYGBgCgoKIyMgU3ltcHRvbXMgCiMjIyBTaW5nbGUgY2FzZXMgey50YWJzZXR9CiMjIyMgQWxsIHN5bXB0b21zCmBgYHtyfQptYWtlVXBzZXRSIDwtIGZ1bmN0aW9uKGlucHV0X2RmKXsKdmFyX3NpbmdsZSA8LSBpbnB1dF9kZiAKY29scyA8LSBzYXBwbHkodmFyX3NpbmdsZSwgaXMubG9naWNhbCkKdmFyX3NpbmdsZVssY29sc10gPC0gbGFwcGx5KHZhcl9zaW5nbGVbLGNvbHNdLCBhcy5udW1lcmljKQoKdmFyX3NpbmdsZV91cHNldHIgPC0gdmFyX3NpbmdsZSAKdmFyX3NpbmdsZV91cHNldHJbaXMubmEodmFyX3NpbmdsZV91cHNldHIpXSA8LSAwCnZhcl9zaW5nbGVfdXBzZXRyIDwtIGFzLmRhdGEuZnJhbWUodmFyX3NpbmdsZV91cHNldHIpCmZvcihpIGluIDE6bmNvbCh2YXJfc2luZ2xlX3Vwc2V0cikpeyB2YXJfc2luZ2xlX3Vwc2V0clsgLCBpXSA8LSBhcy5pbnRlZ2VyKHZhcl9zaW5nbGVfdXBzZXRyWyAsIGldKSB9CnVwc2V0KHZhcl9zaW5nbGVfdXBzZXRyLCBzZXRzID0gYyhjb2xuYW1lcyh2YXJfc2luZ2xlX3Vwc2V0cikpLCBzZXRzLmJhci5jb2xvciA9ICIjNTZCNEU5IiwKb3JkZXIuYnkgPSAiZnJlcSIsIGtlZXAub3JkZXIgPSBUUlVFKSMsIGVtcHR5LmludGVyc2VjdGlvbnMgPSAib24iLCBrZWVwLm9yZGVyID0gRkFMU0UpCn0KCm1ha2VVcHNldFIoZGZfc2luZ2xlY2FzZXMgJT4lIHNlbGVjdChjb250YWlucyggInN5bXAiKSkgJT4lIHNlbGVjdChjb250YWlucygiYW55IikpKQpgYGAKCiMjIyMgUmVzcGlyYXRvcnkKYGBge3J9Cm1ha2VVcHNldFIoZGZfc2luZ2xlY2FzZXMgJT4lIHNlbGVjdChjb250YWlucygic3ltcCIpKSAlPiUgc2VsZWN0KGNvbnRhaW5zKCJyZXNwIikpICU+JSBzZWxlY3QoLWNvbnRhaW5zKCJhbnkiKSkpCmBgYAoKIyMjIyBDYXJkaW92YXNjdWxhcgpgYGB7cn0KbWFrZVVwc2V0UihkZl9zaW5nbGVjYXNlcyAlPiUgc2VsZWN0KGNvbnRhaW5zKCJzeW1wIikpICU+JSBzZWxlY3QoY29udGFpbnMoImNhcmRpb3Zhc2MiKSkgJT4lIHNlbGVjdCgtY29udGFpbnMoIkxWRUYiKSkgJT4lIHNlbGVjdCgtY29udGFpbnMoImFueSIpKSkKYGBgCgojIyMjIEdJCmBgYHtyfQptYWtlVXBzZXRSKGRmX3NpbmdsZWNhc2VzICU+JSBzZWxlY3QoY29udGFpbnMoInN5bXAiKSkgJT4lIHNlbGVjdChjb250YWlucygiR0kiKSkgJT4lIHNlbGVjdCgtY29udGFpbnMoIm5ldXJvIikpICU+JSBzZWxlY3QoLWNvbnRhaW5zKCJhbnkiKSkpCmBgYAoKIyMjIFNpbmdsZSBjYXNlcyArIGNvaG9ydCB7LnRhYnNldH0KIyMjIyBSZXNwaXJhdG9yeQpgYGB7cn0KYmFyU3ltcCA8LSBmdW5jdGlvbihjb2xuYW1lX2Nob3J0LCBjb2xuYW1lX3NpbmdsZSwgZXhjbHVkZV9zaW5nbGUgPSBOVUxMLCBwbG90dGl0bGUpewoKdmFyX2NvaG9ydCA8LSBkZl9jb2hvcnQgJT4lIAogICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3QoY29udGFpbnMoImNvaG9ydF9pZCIpIHwgY29udGFpbnMoInRvdF9jYXNlc19uIikgfCAoY29udGFpbnMoY29sbmFtZV9jaG9ydCkgJiBjb250YWlucygiX24iKSkpCgp2YXJfY29ob3J0IDwtIHZhcl9jb2hvcnQgJT4lIAogICAgICAgIGdhdGhlcih2YXJpYWJsZSwgdmFsdWUsIDM6bmNvbCh2YXJfY29ob3J0KSkgJT4lIAogICAgICAgIGRyb3BfbmEodmFsdWUpICAlPiUgZ3JvdXBfYnkodmFyaWFibGUpICU+JSAKICAgICAgICBzdW1tYXJpemUocHJjdCA9IHN1bSh2YWx1ZSkvc3VtKHRvdF9jYXNlc19uKSoxMDApCgp2YXJfY29ob3J0IDwtIHNldE5hbWVzKHZhcl9jb2hvcnQkcHJjdCwgdmFyX2NvaG9ydCR2YXJpYWJsZSkKbmFtZXModmFyX2NvaG9ydCkgPC0gc3ViKCJfbiIsICIiLCBuYW1lcyh2YXJfY29ob3J0KSkKCm5fc2luZ2xlIDwtIGRmX3NpbmdsZWNhc2VzICU+JSBucm93KCkKCmlmICghaXMubnVsbChleGNsdWRlX3NpbmdsZSkpewogIHZhcl9zaW5nbGUgPC0gZGZfc2luZ2xlY2FzZXMgJT4lIHNlbGVjdCgtY29udGFpbnMoZXhjbHVkZV9zaW5nbGUpKQogIHZhcl9zaW5nbGUgPC0gdmFyX3NpbmdsZSAlPiUgc2VsZWN0KGNvbnRhaW5zKGNvbG5hbWVfc2luZ2xlKSkKfSBlbHNlCnsKICB2YXJfc2luZ2xlIDwtIGRmX3NpbmdsZWNhc2VzICU+JSBzZWxlY3QoY29udGFpbnMoY29sbmFtZV9zaW5nbGUpKQp9CgogIyU+JSBzZWxlY3QoLWNvbnRhaW5zKCJhbnkiKSkKY29scyA8LSBzYXBwbHkodmFyX3NpbmdsZSwgaXMubG9naWNhbCkKdmFyX3NpbmdsZVssY29sc10gPC0gbGFwcGx5KHZhcl9zaW5nbGVbLGNvbHNdLCBhcy5udW1lcmljKQp2YXJfc2luZ2xlIDwtIGNvbFN1bXModmFyX3NpbmdsZSwgbmEucm0gPSBUUlVFKQp2YXJfc2luZ2xlIDwtIHZhcl9zaW5nbGUvbnJvdyhkZl9zaW5nbGVjYXNlcykqMTAwCgpiYXJfZGZfcHJjdCA8LSBkYXRhLmZyYW1lKAogIHggPSBjKG5hbWVzKHZhcl9zaW5nbGUpLCBuYW1lcyh2YXJfY29ob3J0KSksCiAgdmFscyA9IGModmFyX3NpbmdsZSwgdmFyX2NvaG9ydCksCiAgY29sID0gYyhyZXAoInNpbmdsZSIsIGxlbmd0aCh2YXJfc2luZ2xlKSksIHJlcCgiY29ob3J0cyIsIGxlbmd0aCh2YXJfY29ob3J0KSkpCikKCnBfcHJjdCA8LSBnZ3Bsb3QoYmFyX2RmX3ByY3QsIGFlcyh4ID0geCwgeSA9ICB2YWxzLCBmaWxsID0gY29sKSkgKwogICAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gImRvZGdlIikgKwogICAgdGhlbWVfYncoKSArIAogICAgbGFicyh0aXRsZSA9IHBsb3R0aXRsZSwgCiAgICAgICAgICBzdWJ0aXRsZSA9ICJQZXJjZW50IG9mIGdyb3VwIiwgeCA9ICJ0cmVhdG1lbnQiLCB5ID0gIiUiLCBjb2wgPSAiICIpICArIAogICAgICAgICAgdGhlbWUoYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KGFuZ2xlPTkwLCBoanVzdD0xKSkrCiAgICAgICAgICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSB3ZXNfcGFsZXR0ZSgiUm95YWwxIikpCnBfcHJjdAp9CgptYWtlSGVhdG1hcF9jb2hvcnQoInN5bXBfcmVzcCIsICJzeW1wX3Jlc3AiLCBwbG90dGl0bGUgPSAiQ2FzZXMgd2l0aCByZXNwaXJhdG9yeSBzeW1wdG9tcywgcGVyIGNvaG9ydCIpCgpiYXJTeW1wKCJzeW1wX3Jlc3AiLCAic3ltcF9yZXNwIiwgcGxvdHRpdGxlID0gIkNhc2VzIHdpdGggcmVzcGlyYXRvcnkgc3ltcHRvbXMiKQpgYGAKCgpgYGB7cn0KIyB2YXJfY29ob3J0IDwtIGRmX2NvaG9ydCAlPiUgc2VsZWN0KCgiY29ob3J0X2lkIikgfCAidG90X2Nhc2VzX24iIHwoIGNvbnRhaW5zKCJzeW1wX3Jlc3AiKSAmIGNvbnRhaW5zKCJuIikpKQojIAojIHJlc3Bfc3ltcF9jb2hvcnQgPC0gdmFyX2NvaG9ydCAlPiUgCiMgICBnYXRoZXIodmFyaWFibGUsIHZhbHVlLCAzOm5jb2wodmFyX2NvaG9ydCkpICU+JSBncm91cF9ieShjb2hvcnRfaWQsIHZhcmlhYmxlKSAlPiUgc3VtbWFyaXplKHByY3QgPSB2YWx1ZS90b3RfY2FzZXNfbikKIyAKIyBnZ3Bsb3QocmVzcF9zeW1wX2NvaG9ydCwgYWVzKHggPSBwcmN0LCB5ID0gY29ob3J0X2lkLCBjb2wgPSB2YXJpYWJsZSkpICsgZ2VvbV9wb2ludCgpCmBgYAoKIyMjIyBDYXJkaW92YXNjdWxhcgpgYGB7cn0KbWFrZUhlYXRtYXBfY29ob3J0KCJzeW1wX2NhcmRpb3Zhc2MiLCAic3ltcF9jYXJkaW92YXNjIiwgZXhjbHVkZV9zaW5nbGUgPSAic3ltcF9jYXJkaW92YXNjX0xWRUYiLCBwbG90dGl0bGUgPSAiQ2FzZXMgd2l0aCBjYXJkaW92YXNjdWxhciBzeW1wdG9tcywgcGVyIGNvaG9ydCIpCgpiYXJTeW1wKCJzeW1wX2NhcmRpb3Zhc2MiLCAic3ltcF9jYXJkaW92YXNjIiwgZXhjbHVkZV9zaW5nbGUgPSAic3ltcF9jYXJkaW92YXNjX0xWRUYiLCBwbG90dGl0bGUgPSAiQ2FzZXMgd2l0aCBjYXJkaW92YXNjdWxhciBzeW1wdG9tcyIpCmBgYAoKIyMjIyBHYXN0cm8taW50ZXN0aW5hbApgYGB7cn0KbWFrZUhlYXRtYXBfY29ob3J0KCJzeW1wX0dJIiwgInN5bXBfR0kiLCBwbG90dGl0bGUgPSAiQ2FzZXMgd2l0aCBHSSBzeW1wdG9tcywgcGVyIGNvaG9ydCIpCgpiYXJTeW1wKCJzeW1wX0dJIiwgInN5bXBfR0kiLCBwbG90dGl0bGUgPSAiQ2FzZXMgd2l0aCBHSSBzeW1wdG9tcyIpCmBgYAoKIyMgQ09WSUQgY29udGFjdApgYGB7cn0KdmFyX2NvaG9ydCA8LSBkZl9jb2hvcnQgJT4lIHNlbGVjdCgoImNvaG9ydF9pZCIgfCAidG90X2Nhc2VzX24iKSB8ICggY29udGFpbnMoImNvdmlkIikgJiBjb250YWlucygiX24iKSAmIChjb250YWlucygicG9zIikgfCBjb250YWlucygiY2xvc2Vjb250IikgIHwgY29udGFpbnMoImFueSIpKSkpCnZhcl9jb2hvcnQkY29ob3J0X2lkIDwtIHBhc3RlMCh2YXJfY29ob3J0JGNvaG9ydF9pZCwgIiAobiA9ICIsIGFzLmNoYXJhY3Rlcih2YXJfY29ob3J0JHRvdF9jYXNlc19uKSwiKSIpCgp2YXJfY29ob3J0IDwtIHZhcl9jb2hvcnQgJT4lIAogIGdhdGhlcih2YXJpYWJsZSwgdmFsdWUsIDM6bmNvbCh2YXJfY29ob3J0KSkgJT4lIGdyb3VwX2J5KGNvaG9ydF9pZCwgdmFyaWFibGUpICU+JSBzdW1tYXJpemUocHJjdCA9IHZhbHVlL3RvdF9jYXNlc19uKjEwMCkKCnZhcl9jb2hvcnQkdmFyaWFibGUgPC0gc3ViKCJuXyIsICIiLCB2YXJfY29ob3J0JHZhcmlhYmxlKQoKdmFyX3NpbmdsZSA8LSBkZl9zaW5nbGVjYXNlcyAlPiUgc2VsZWN0KGNvbnRhaW5zKCJjb3ZpZCIpKQpjb2xzIDwtIHNhcHBseSh2YXJfc2luZ2xlLCBpcy5sb2dpY2FsKQp2YXJfc2luZ2xlWyxjb2xzXSA8LSBsYXBwbHkodmFyX3NpbmdsZVssY29sc10sIGFzLm51bWVyaWMpCnZhcl9zaW5nbGUgPC0gY29sU3Vtcyh2YXJfc2luZ2xlLCBuYS5ybSA9IFRSVUUpCnZhcl9zaW5nbGUgPC0gdmFyX3NpbmdsZS9ucm93KGRmX3NpbmdsZWNhc2VzKSoxMDAKdmFyX3NpbmdsZSA8LSBhcy5kYXRhLmZyYW1lKHZhcl9zaW5nbGUpICU+JSByb3duYW1lc190b19jb2x1bW4oKQp2YXJfc2luZ2xlJGNvaG9ydF9pZCA8LSAic2luZ2xlX2Nhc2VzIgpjb2xuYW1lcyh2YXJfc2luZ2xlKSA8LSBjKCJ2YXJpYWJsZSIsICJwcmN0IiwgImNvaG9ydF9pZCIpCgoKbWlzc2luZyA8LSBzZXRkaWZmKHZhcl9zaW5nbGUkdmFyaWFibGUsIHZhcl9jb2hvcnQkdmFyaWFibGUpCmlmIChsZW5ndGgobWlzc2luZykgIT0gMCApewogIG1pc3NpbmdfZGYgPC0gZGF0YS5mcmFtZSh2YXJpYWJsZSA9IG1pc3NpbmcsIHByY3QgPSByZXAoTkEsIGxlbmd0aChtaXNzaW5nKSksIGNvaG9ydF9pZCA9IHJlcCh1bmlxdWUodmFyX2NvaG9ydCRjb2hvcnRfaWQpLCBsZW5ndGgobWlzc2luZykpKQogIHZhcl9jb2hvcnQgPC0gYmluZF9yb3dzKHZhcl9jb2hvcnQsIGFzX3RpYmJsZShtaXNzaW5nX2RmKSkKfSAKCm1pc3NpbmcgPC0gc2V0ZGlmZih2YXJfY29ob3J0JHZhcmlhYmxlLCB2YXJfc2luZ2xlJHZhcmlhYmxlKQoKaWYgKGxlbmd0aChtaXNzaW5nKSAhPSAwKSB7CiAgaWYgKGxlbmd0aChtaXNzaW5nKSAhPSAwKXsKZGF0YS5mcmFtZSh2YXJpYWJsZSA9IG1pc3NpbmcsIHByY3QgPSByZXAoTkEsIGxlbmd0aChtaXNzaW5nKSksIGNvaG9ydF9pZCA9IHJlcCh1bmlxdWUodmFyX3NpbmdsZSRjb2hvcnRfaWQpLCBsZW5ndGgobWlzc2luZykpKQogIHZhcl9zaW5nbGUgPC0gYmluZF9yb3dzKHZhcl9zaW5nbGUsIGFzX3RpYmJsZShtaXNzaW5nX2RmKSkKICB9Cn0KCgpobV9jb2hvcnQgPC0gZ2dwbG90KHZhcl9jb2hvcnQsIGFlcyh4ID0gdmFyaWFibGUsIHkgPSBjb2hvcnRfaWQsIGZpbGwgPSBwcmN0KSkgKyAKICAgIGdlb21fdGlsZSgpICsgdGhlbWVfY2xhc3NpYygpICsKICAgIHRoZW1lKGF4aXMudGV4dC54PWVsZW1lbnRfYmxhbmsoKSwgYXhpcy50aWNrcy54PWVsZW1lbnRfYmxhbmsoKSwgYXhpcy5saW5lPWVsZW1lbnRfYmxhbmsoKSkrCiAgIHNjYWxlX2ZpbGxfZ3JhZGllbnQobG93ID0gInllbGxvdyIsIGhpZ2g9InJlZCIsIG5hLnZhbHVlID0gImxpZ2h0Z3JheSIsIGxpbWl0cyA9IGMoMCwxMDApKSArCiAgICBsYWJzKHggPSAiIiwgeSA9ICJjb2hvcnQiLCB0aXRsZSA9ICJDT1ZJRCBzeW1wdG9tcywgcGVyIGNvaG9ydCIpICsKICAgIGdlb21fdGV4dChhZXMobGFiZWw9cm91bmQocHJjdCwgMikpLCBzaXplID0gMywgY29sb3IgPSAiYmxhY2siKQoKaG1fc2luZ2xlIDwtIGdncGxvdCh2YXJfc2luZ2xlLCBhZXMoeCA9IHZhcmlhYmxlLCB5ID0gY29ob3J0X2lkLCBmaWxsID0gcHJjdCkpICsgCiAgICBnZW9tX3RpbGUoKSArICB0aGVtZV9jbGFzc2ljKCkgKwogICAgdGhlbWUoYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KGFuZ2xlPTkwLCBoanVzdD0xKSwgYXhpcy5saW5lPWVsZW1lbnRfYmxhbmsoKSkrCiAgICBzY2FsZV9maWxsX2dyYWRpZW50KGxvdyA9ICJ5ZWxsb3ciLCBoaWdoID0gInJlZCIsIG5hLnZhbHVlID0gImxpZ2h0Z3JheSIsIGxpbWl0cyA9IGMoMCwxMDApKSsgbGFicyh5ID0gImNvaG9ydCIpICsKICAgIGdlb21fdGV4dChhZXMobGFiZWw9cm91bmQocHJjdCwgMikpLCBzaXplID0gMywgY29sb3IgPSAiYmxhY2siKSAKCnBsb3RfZ3JpZChobV9jb2hvcnQsIGhtX3NpbmdsZSwgYWxpZ24gPSAidiIsIG5yb3cgPSAyLCByZWxfaGVpZ2h0cyA9IGMoMS8yLCAxLzIpKQoKYGBgCgpgYGB7cn0KdmFyX2NvaG9ydCA8LSBkZl9jb2hvcnQgJT4lIAogICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3QoY29udGFpbnMoImNvaG9ydF9pZCIpIHwgY29udGFpbnMoInRvdF9jYXNlc19uIikgfCBjb250YWlucygiY292aWQiKSAmIGNvbnRhaW5zKCJfbiIpICYgKGNvbnRhaW5zKCJfcG9zIikgfCBjb250YWlucygiY2xvc2UiKSkpCgpjb3ZpZF9jb2hvcnQgPC0gdmFyX2NvaG9ydCAlPiUgCiAgICAgICAgZ2F0aGVyKHZhcmlhYmxlLCB2YWx1ZSwgMzpuY29sKHZhcl9jb2hvcnQpKSAlPiUgCiAgICAgICAgZHJvcF9uYSh2YWx1ZSkgICU+JSBncm91cF9ieSh2YXJpYWJsZSkgJT4lIAogICAgICAgIHN1bW1hcml6ZShwcmN0ID0gc3VtKHZhbHVlKS9zdW0odG90X2Nhc2VzX24pKjEwMCkKCmNvdmlkX2NvaG9ydCA8LSBzZXROYW1lcyhjb3ZpZF9jb2hvcnQkcHJjdCwgY292aWRfY29ob3J0JHZhcmlhYmxlKQoKbl9zaW5nbGUgPC0gZGZfc2luZ2xlY2FzZXMgJT4lIG5yb3coKQp2YXJfc2luZ2xlIDwtIGRmX3NpbmdsZWNhc2VzICU+JSBzZWxlY3QoY29udGFpbnMoImNvdmlkIikpIApjb2xzIDwtIHNhcHBseSh2YXJfc2luZ2xlLCBpcy5sb2dpY2FsKQp2YXJfc2luZ2xlWyxjb2xzXSA8LSBsYXBwbHkodmFyX3NpbmdsZVssY29sc10sIGFzLm51bWVyaWMpCgptYWtlVXBzZXRSKGRmX3NpbmdsZWNhc2VzICU+JSBzZWxlY3QoY29udGFpbnMoImNvdmlkIikpICU+JSBzZWxlY3QoLWNvbnRhaW5zKCJjb3ZpZF9JZ01fcG9zIikpICU+JSBzZWxlY3QoLWNvbnRhaW5zKCJjb3ZpZF9JZ0FfcG9zIikpICAlPiUgc2VsZWN0KC1jb250YWlucygiY292aWRfSWdHX3BvcyIpKSAgJT4lIHNlbGVjdCgtY29udGFpbnMoImNvdmlkX3Nlcm9fcG9zIikpICkKCnZhcl9zaW5nbGUgPC0gY29sU3Vtcyh2YXJfc2luZ2xlLCBuYS5ybSA9IFRSVUUpCnZhcl9zaW5nbGUgPC0gdmFyX3NpbmdsZS9ucm93KGRmX3NpbmdsZWNhc2VzKSoxMDAKCmJhcl9kZl9wcmN0IDwtIGRhdGEuZnJhbWUoCiAgeCA9IGMoImNsb3NlIGNvbnRhY3QgcmVwb3J0ZWQiLCAiUENSICsiLCAic3Rvb2wgKyIsIlBDUiBvciBzdG9vbCBvciBzZXJvICsiLCAiYW55IHNlcm9sb2d5ICsiLCAic2VybyArIGZ1cnRoZXIgTlMiLCAiSWdBICsiLCAiSWdNICsiLCAiSWdHICsiLCAiY2xvc2UgY29udGFjdCByZXBvcnRlZCIsICJJZ0EgKyIsICJJZ0cgKyIsICJJZ00gKyIsICJQQ1IgKyIsICJzZXJvICsgZnVydGhlciBOUyIsICJzdG9vbCArIiksCiAgdmFscyA9IGModmFyX3NpbmdsZSwgY292aWRfY29ob3J0KSwKICBjb2wgPSBjKHJlcCgic2luZ2xlIiwgbGVuZ3RoKHZhcl9zaW5nbGUpKSwgcmVwKCJjb2hvcnRzIiwgbGVuZ3RoKGNvdmlkX2NvaG9ydCkpKQopCgpwX3ByY3QgPC0gZ2dwbG90KGJhcl9kZl9wcmN0LCBhZXMoeCA9IHgsIHkgPSAgdmFscywgZmlsbCA9IGNvbCkpICsKICAgIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJkb2RnZSIpICsKICAgIHRoZW1lX2J3KCkgKyAKICAgIGxhYnModGl0bGUgPSAiU0FSUy1Db1YyIHRlc3RpbmciLCAKICAgICAgICAgc3VidGl0bGUgPSAiUHJjdCIsIHggPSAidmFyaWFibGUiLCB5ID0gIiUiLCBjb2wgPSAiICIpICsKICAgIHRoZW1lKGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChhbmdsZT05MCwgaGp1c3Q9MSkpICsKICAgIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IHdlc19wYWxldHRlKCJSb3lhbDEiKSkKI3BfcHJjdAoKbmVpdGhlcl9QQ1JfSWcgPC0gbnJvdyhkZl9zaW5nbGVjYXNlcyAlPiUgZmlsdGVyKChjb3ZpZF9zZXJvX2FueSA9PSBGQUxTRSB8IGlzLm5hKGNvdmlkX3Nlcm9fYW55KSkgJiAoY292aWRfUENSX3BvcyA9PSBGQUxTRSB8IGlzLm5hKGNvdmlkX1BDUl9wb3MpKSAmIChjb3ZpZF9QQ1Jfc3Rvb2xfcG9zID09IEZBTFNFIHwgaXMubmEoY292aWRfUENSX3N0b29sX3BvcykpKSkKCm5laXRoZXJfUENSX0lnX2Nsb3NlY29udGFjdCA8LQogIG5yb3coZGZfc2luZ2xlY2FzZXMgJT4lIGZpbHRlcigoY292aWRfc2Vyb19hbnkgPT0gRkFMU0UgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcy5uYShjb3ZpZF9zZXJvX2FueSkpICYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY292aWRfUENSX3BvcyA9PSBGQUxTRSB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMubmEoY292aWRfUENSX3BvcykpICYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY292aWRfUENSX3N0b29sX3BvcyA9PSBGQUxTRSB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMubmEoY292aWRfUENSX3N0b29sX3BvcykpICYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY292aWRfY2xvc2Vjb250YWN0ID09IEZBTFNFIHwgaXMubmEoY292aWRfY2xvc2Vjb250YWN0KSkKICApKQoKcHJpbnQocGFzdGUwKCJDYXNlcyB3aXRoIG5laXRoZXIgUENSIG5vciBzZXJvbG9neTogIiwgbmVpdGhlcl9QQ1JfSWcpKQoKcHJpbnQocGFzdGUwKCJDYXNlcyB3aXRoIG5laXRoZXIgUENSIG5vciBzZXJvbG9neSBub3IgY2xvc2Vjb250YWN0OiAiLCBuZWl0aGVyX1BDUl9JZ19jbG9zZWNvbnRhY3QpKQpgYGAKCiMjIEthd2FzYWtpIGNyaXRlcmlhCgpgYGB7cn0KbWFrZUhlYXRtYXBfY29ob3J0KCJrYXdhc2FraSIsICJrYXdhc2FraSIsZXhjbHVkZV9zaW5nbGUgPSAia295b2JhcyIsIHBsb3R0aXRsZSA9ICJDYXNlcyB3aXRoIGthd2FzYWtpIHN5bXB0b21zLCBwZXIgY29ob3J0IikKCmJhclN5bXAoImthd2FzYWtpIiwgImthd2FzYWtpIiwgZXhjbHVkZV9zaW5nbGUgPSAia295b2JhcyIsIHBsb3R0aXRsZSA9ICJLYXdhc2FraSBzeW1wdG9tcyIpCmBgYAoKIyMgU2hvY2sKYGBge3J9Cm1ha2VCYXJwbG90KCJzeW1wX2NhcmRpb3Zhc2Nfc2hvY2tfbiIsICJzeW1wX2NhcmRpb3Zhc2Nfc2hvY2siLCAiU2hvY2siKQpgYGAKCiMjIExhYiB2YWx1ZXMgey50YWJzZXR9CkZvciBsYWIgdmFsdWVzLCBzb21ldGltZXMgbXVsdGlwbGUgdmFsdWVzIGFyZSByZXBvcnRlZCAoYmFzZWxpbmUsIHBlYWsgb3Igbm90LXNwZWNpZmllZCkuIEFsbCBsYWIgdmFsdWVzIGFyZSBjb2xsYXBzZWQgYmFzZWQgb24gdGhlIG1heCAob3IgdGhlIG1pbiBmb3IgZS5nLiBoZW1vZ2xvYmluKTogc28gb25seSB0aGUgaGlnaGVzdCB2YWx1ZSBvZiBtZWRpYW4sIFExIG9yIFEzIGlzIHVzZWQuIAoKIyMjIEMtcmVhY3RpdmUgcHJvdGVpbgoKYGBge3J9CmNycF9jb2xsYXBzZV9jb2hvcnQgPC0gY29sbGFwc2VfbGFidmFsc19jb2hvcnQoZGZfY29ob3J0X2NvbnRyb2xzLCAibWF4IiwgIkNSUCIpCmNycF9jb2xsYXBzZV9zaW5nbGUgPC0gY29sbGFwc2VfbGFidmFsc19zaW5nbGUoZGZfc2luZ2xlY2FzZXMsICJtYXgiLCAiQ1JQIikKY3JwX21pc3NpbmcgPC0gc3VtKGlzLm5hKGNycF9jb2xsYXBzZV9zaW5nbGUkQ1JQX21heCkpCgpwX2NycF9jb2hvcnQgPC0gZ2dwbG90KGNycF9jb2xsYXBzZV9jb2hvcnQsIGFlcyh5ID0gY29ob3J0X2lkLCB4ID0gQ1JQX21lZCwgY29sID0gY29ob3J0X3R5cGUpKSArIAogICAgICAgIGdlb21fcG9pbnQoKSArICAKICAgICAgICBnZW9tX2Vycm9yYmFyKGFlcyh4bWluPUNSUF9taW4sIHhtYXg9Q1JQX21heCksIHdpZHRoPS4yLCBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSguOSkpICsgbGltcyh4ID0gYygwLDYwMCkpICsgCiAgICAgICAgdGhlbWVfYncoKSArIGxhYnModGl0bGUgPSAiQ1JQIiwgeSA9ICJjb2hvcnQiLCB4ID0gIiIpICsKICAgICAgICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBjb19DUlAsIGxpbmV0eXBlID0gImRhc2hlZCIsIGNvbG9yID0gImJsYWNrIikgKyB0aGVtZShsZWdlbmQuanVzdGlmaWNhdGlvbiA9IGMoMSwgMSksIGxlZ2VuZC5wb3NpdGlvbiA9IGMoMC45OCwgMC45OCksIGxlZ2VuZC50aXRsZT1lbGVtZW50X2JsYW5rKCkpICsKICAgICAgICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gd2VzX3BhbGV0dGUoIlJveWFsMSIpKQoKcF9jcnBfc2luZ2xlIDwtIGdncGxvdChjcnBfY29sbGFwc2Vfc2luZ2xlLCBhZXMoeCA9IGFzLm51bWVyaWMoQ1JQX21heCksIHkgPSBjb2hvcnRfaWQpKSArCiAgICAgIGdlb21fdmlvbGluKGZpbGwgPSB3ZXNfcGFsZXR0ZSgiRGFyamVlbGluZzIiKVs0XSkgKyAKICAgICAgZ2VvbV9ib3hwbG90KHdpZHRoPS4zLCBmaWxsID0gIHdlc19wYWxldHRlKCJEYXJqZWVsaW5nMiIpWzFdKSArIAogICAgICB0aGVtZV9idygpICsgZ2VvbV9iZWVzd2FybShncm91cE9uWD1GQUxTRSwgYWxwaGEgPSAwLjUpICsgbGltcyh4ID0gYygwLDYwMCkpICsgbGFicyh5ID0gIiIsIHggPSAiQ1JQIChtZy9kTCkiLCBzdWJ0aXRsZSA9IHBhc3RlMCgibWlzc2luZyBkYXRhIGZvciAiLCBjcnBfbWlzc2luZywgIiBjYXNlcyIpKSArCiAgICAgIGdlb21faGxpbmUoeWludGVyY2VwdCA9IGNvX0NSUCwgbGluZXR5cGUgPSAiZGFzaGVkIiwgY29sb3IgPSAiYmxhY2siKQoKQ1JQX2dyaWQgPC0gcGxvdF9ncmlkKHBfY3JwX2NvaG9ydCwgcF9jcnBfc2luZ2xlLCBhbGlnbiA9ICJ2IiwgbnJvdyA9IDIsIHJlbF9oZWlnaHRzID0gYygyLzMsIDEvMykpCkNSUF9ncmlkCmBgYAoKIyMjIEx5bXBob2N5dGVzCmBgYHtyfQpseW1waG9fY29sbGFwc2VfY29ob3J0IDwtIGNvbGxhcHNlX2xhYnZhbHNfY29ob3J0KGRmX2NvaG9ydF9jb250cm9scywgIm1pbiIsICJseW1waG8iKQpseW1waG9fY29sbGFwc2Vfc2luZ2xlIDwtIGNvbGxhcHNlX2xhYnZhbHNfc2luZ2xlKGRmX3NpbmdsZWNhc2VzLCAibWluIiwgImx5bXBobyIpCmx5bXBob19taXNzaW5nIDwtIHN1bShpcy5uYShseW1waG9fY29sbGFwc2Vfc2luZ2xlJGx5bXBob19taW4pKQoKcF9seW1waG9fY29ob3J0IDwtIGdncGxvdChseW1waG9fY29sbGFwc2VfY29ob3J0LCBhZXMoeSA9IGNvaG9ydF9pZCwgeCA9IGx5bXBob19tZWQsIGNvbCA9IGNvaG9ydF90eXBlKSkgKyAKICAgICAgICBnZW9tX3BvaW50KCkgKyAgCiAgICAgICAgZ2VvbV9lcnJvcmJhcihhZXMoeG1pbj1seW1waG9fbWluLCB4bWF4PWx5bXBob19tYXgpLCB3aWR0aD0uMiwgcG9zaXRpb249cG9zaXRpb25fZG9kZ2UoLjkpKSArIAogICAgICAgIHRoZW1lX2J3KCkgKyBsYWJzKHRpdGxlID0gImx5bXBob2N5dGVzIiwgeSA9ICIiLCB4ID0gIiIpICsgbGltcyh4ID0gYygwLDc1MDApKSAgKwogICAgICAgICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBjb19seW1waG8sIGxpbmV0eXBlID0gImRhc2hlZCIsIGNvbG9yID0gImJsYWNrIikgKyB0aGVtZShsZWdlbmQuanVzdGlmaWNhdGlvbiA9IGMoMSwgMSksIGxlZ2VuZC5wb3NpdGlvbiA9IGMoMC45OCwgMC45OCksIGxlZ2VuZC50aXRsZT1lbGVtZW50X2JsYW5rKCkpICsKICAgICAgICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gd2VzX3BhbGV0dGUoIlJveWFsMSIpKSMrCiAgICAgICAgI3JyZW1vdmUoInkudGV4dCIpIAoKcF9seW1waG9fc2luZ2xlIDwtIGdncGxvdChseW1waG9fY29sbGFwc2Vfc2luZ2xlLCBhZXMoeCA9IGFzLm51bWVyaWMobHltcGhvX21pbiksIHkgPSBjb2hvcnRfaWQpKSArCiAgICAgIGdlb21fdmlvbGluKGZpbGwgPSB3ZXNfcGFsZXR0ZSgiRGFyamVlbGluZzIiKVs0XSkgKyAKICAgICAgZ2VvbV9ib3hwbG90KHdpZHRoPS4zLCBmaWxsID0gd2VzX3BhbGV0dGUoIkRhcmplZWxpbmcyIilbMV0pICsgCiAgICAgIGxpbXMoeCA9IGMoMCw3NTAwKSkrCiAgICAgIHRoZW1lX2J3KCkgKyBnZW9tX2JlZXN3YXJtKGdyb3VwT25YPUZBTFNFLCBhbHBoYSA9IDAuNSkgICsgbGFicyh5ID0gIiIsIHggPSAiTHltcGhvY3l0ZXMgKC/CtUwpIiwgc3VidGl0bGUgPSBwYXN0ZTAoIm1pc3NpbmcgZGF0YSBmb3IgIiwgbHltcGhvX21pc3NpbmcsICIgY2FzZXMiKSkgKwogICAgICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBjb19seW1waG8sIGxpbmV0eXBlID0gImRhc2hlZCIsIGNvbG9yID0gImJsYWNrIikgIysgCiAgICAgICNycmVtb3ZlKCJ5LnRleHQiKSAKCmx5bXBob19ncmlkIDwtIHBsb3RfZ3JpZChwX2x5bXBob19jb2hvcnQsIHBfbHltcGhvX3NpbmdsZSwgYWxpZ24gPSAidiIsIG5yb3cgPSAyLCByZWxfaGVpZ2h0cyA9IGMoMi8zLCAxLzMpKQpseW1waG9fZ3JpZApgYGAKCiMjIyBXaGl0ZSBibG9vZCBjZWxscwpgYGB7cn0Kd2JjX2NvbGxhcHNlX2NvaG9ydCA8LSBjb2xsYXBzZV9sYWJ2YWxzX2NvaG9ydChkZl9jb2hvcnRfY29udHJvbHMsICJtYXgiLCAiV0JDIikKd2JjX2NvbGxhcHNlX3NpbmdsZSA8LSBjb2xsYXBzZV9sYWJ2YWxzX3NpbmdsZShkZl9zaW5nbGVjYXNlcywgIm1heCIsICJXQkMiKQp3YmNfbWlzc2luZyA8LSBzdW0oaXMubmEod2JjX2NvbGxhcHNlX3NpbmdsZSRXQkNfbWF4KSkKCnBfd2JjX2NvaG9ydCA8LSBnZ3Bsb3Qod2JjX2NvbGxhcHNlX2NvaG9ydCwgYWVzKHkgPSBjb2hvcnRfaWQsIHggPSBXQkNfbWVkLCBjb2wgPSBjb2hvcnRfdHlwZSkpICsgCiAgICAgICAgZ2VvbV9wb2ludCgpICsgIAogICAgICAgIGdlb21fZXJyb3JiYXIoYWVzKHhtaW49V0JDX21pbiwgeG1heD1XQkNfbWF4KSwgd2lkdGg9LjIsIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKC45KSkgKyBsaW1zKHggPSBjKDAsNTAwMDApKSArIAogICAgICAgIHRoZW1lX2J3KCkgKyBsYWJzKHRpdGxlID0gIldCQyIsIHkgPSAiY29ob3J0IiwgeCA9ICIiKSAgKwogICAgICAgIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGNvX1dCQywgbGluZXR5cGUgPSAiZGFzaGVkIiwgY29sb3IgPSAiYmxhY2siKSAgKyB0aGVtZShsZWdlbmQuanVzdGlmaWNhdGlvbiA9IGMoMSwgMSksIGxlZ2VuZC5wb3NpdGlvbiA9IGMoMC45OCwgMC45OCksIGxlZ2VuZC50aXRsZT1lbGVtZW50X2JsYW5rKCkpICsKICAgICAgICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gd2VzX3BhbGV0dGUoIlJveWFsMSIpKQoKcF93YmNfc2luZ2xlIDwtIGdncGxvdCh3YmNfY29sbGFwc2Vfc2luZ2xlLCBhZXMoeCA9IGFzLm51bWVyaWMoV0JDX21heCksIHkgPSBjb2hvcnRfaWQpKSArCiAgICAgIGdlb21fdmlvbGluKGZpbGwgPSB3ZXNfcGFsZXR0ZSgiRGFyamVlbGluZzIiKVs0XSkgKyAKICAgICAgZ2VvbV9ib3hwbG90KHdpZHRoPS4zLCBmaWxsID0gd2VzX3BhbGV0dGUoIkRhcmplZWxpbmcyIilbMV0pICsgCiAgICAgIHRoZW1lX2J3KCkgKyBnZW9tX2JlZXN3YXJtKGdyb3VwT25YPUZBTFNFLCBhbHBoYSA9IDAuNSkgKyBsYWJzKHkgPSAiIiwgeCA9ICJXQkMgKC/CtUwpIiwgc3VidGl0bGUgPSBwYXN0ZTAoIm1pc3NpbmcgZGF0YSBmb3IgIiwgd2JjX21pc3NpbmcsICIgY2FzZXMiKSkgKyBsaW1zKHggPSBjKDAsNTAwMDApKSArCiAgICAgIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGNvX1dCQywgbGluZXR5cGUgPSAiZGFzaGVkIiwgY29sb3IgPSAiYmxhY2siKSAKCldCQ19ncmlkIDwtIHBsb3RfZ3JpZChwX3diY19jb2hvcnQsIHBfd2JjX3NpbmdsZSwgYWxpZ24gPSAidiIsIG5yb3cgPSAyLCByZWxfaGVpZ2h0cyA9IGMoMi8zLCAxLzMpKQpXQkNfZ3JpZApgYGAKCgojIyMgRmVycml0aW4KYGBge3J9CmZlcnJpdGluX2NvbGxhcHNlX2NvaG9ydCA8LSBjb2xsYXBzZV9sYWJ2YWxzX2NvaG9ydChkZl9jb2hvcnRfY29udHJvbHMsICJtYXgiLCAiZmVycml0IikKZmVycml0aW5fY29sbGFwc2Vfc2luZ2xlIDwtIGNvbGxhcHNlX2xhYnZhbHNfc2luZ2xlKGRmX3NpbmdsZWNhc2VzLCAibWF4IiwgImZlcnJpdCIpCmZlcnJpdGluX21pc3NpbmcgPC0gc3VtKGlzLm5hKGZlcnJpdGluX2NvbGxhcHNlX3NpbmdsZSRmZXJyaXRfbWF4KSkKCnBfZmVycml0aW5fY29ob3J0IDwtIGdncGxvdChmZXJyaXRpbl9jb2xsYXBzZV9jb2hvcnQsIGFlcyh5ID0gY29ob3J0X2lkLCB4ID0gZmVycml0X21lZCwgY29sID0gY29ob3J0X3R5cGUpKSArIAogICAgICAgIGdlb21fcG9pbnQoKSArICAKICAgICAgICBnZW9tX2Vycm9yYmFyKGFlcyh4bWluPWZlcnJpdF9taW4sIHhtYXg9ZmVycml0X21heCksIHdpZHRoPS4yLCBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSguOSkpICsgbGltcyh4ID0gYygwLDExMDAwKSkgKyAKICAgICAgICB0aGVtZV9idygpICsgbGFicyh0aXRsZSA9ICJGZXJyaXRpbiIsIHkgPSAiY29ob3J0IiwgeCA9ICIiKSArCiAgICAgICAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gY29fZmVycml0aW4sIGxpbmV0eXBlID0gImRhc2hlZCIsIGNvbG9yID0gImJsYWNrIikgKyB0aGVtZShsZWdlbmQuanVzdGlmaWNhdGlvbiA9IGMoMSwgMSksIGxlZ2VuZC5wb3NpdGlvbiA9IGMoMC45OCwgMC45OCksIGxlZ2VuZC50aXRsZT1lbGVtZW50X2JsYW5rKCkpICsKICAgICAgICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gd2VzX3BhbGV0dGUoIlJveWFsMSIpKQoKcF9mZXJyaXRpbl9zaW5nbGUgPC0gZ2dwbG90KGZlcnJpdGluX2NvbGxhcHNlX3NpbmdsZSwgYWVzKHggPSBhcy5udW1lcmljKGZlcnJpdF9tYXgpLCB5ID0gY29ob3J0X2lkKSkgKwogICAgICBnZW9tX3Zpb2xpbihmaWxsID0gd2VzX3BhbGV0dGUoIkRhcmplZWxpbmcyIilbNF0pICsgCiAgICAgIGdlb21fYm94cGxvdCh3aWR0aD0uMywgZmlsbCA9IHdlc19wYWxldHRlKCJEYXJqZWVsaW5nMiIpWzFdKSArIAogICAgICB0aGVtZV9idygpICsgZ2VvbV9iZWVzd2FybShncm91cE9uWD1GQUxTRSwgYWxwaGEgPSAwLjUpICsgbGFicyh5ID0gIiIsIHggPSAiRmVycml0aW4gKMK1Zy9sKSIsIHN1YnRpdGxlID0gcGFzdGUwKCJtaXNzaW5nIGRhdGEgZm9yICIsIGZlcnJpdGluX21pc3NpbmcsICIgY2FzZXMiKSkgKyBsaW1zKHggPSBjKDAsMTEwMDApKSArCiAgICAgIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGNvX2ZlcnJpdGluLCBsaW5ldHlwZSA9ICJkYXNoZWQiLCBjb2xvciA9ICJibGFjayIpIAoKZmVycml0aW5fZ3JpZCA8LSBwbG90X2dyaWQocF9mZXJyaXRpbl9jb2hvcnQsIHBfZmVycml0aW5fc2luZ2xlLCBhbGlnbiA9ICJ2IiwgbnJvdyA9IDIsIHJlbF9oZWlnaHRzID0gYygyLzMsIDEvMykpCmZlcnJpdGluX2dyaWQKYGBgCgoKIyMjIFRyb3BvbmluCmBgYHtyfQp0cm9wb25pbl9jb2xsYXBzZV9jb2hvcnQgPC0gY29sbGFwc2VfbGFidmFsc19jb2hvcnQoZGZfY29ob3J0X2NvbnRyb2xzLCAibWF4IiwgInRyb3BvbmluIikKdHJvcG9uaW5fY29sbGFwc2Vfc2luZ2xlIDwtIGNvbGxhcHNlX2xhYnZhbHNfc2luZ2xlKGRmX3NpbmdsZWNhc2VzLCAibWF4IiwgInRyb3BvbmluIikKdHJvcG9uaW5fbWlzc2luZyA8LSBzdW0oaXMubmEodHJvcG9uaW5fY29sbGFwc2Vfc2luZ2xlJHRyb3BvbmluX21heCkpCgpwX3Ryb3BvbmluX2NvaG9ydCA8LSBnZ3Bsb3QodHJvcG9uaW5fY29sbGFwc2VfY29ob3J0LCBhZXMoeSA9IGNvaG9ydF9pZCwgeCA9IHRyb3BvbmluX21lZCwgY29sID0gY29ob3J0X3R5cGUpKSArIAogICAgICAgIGdlb21fcG9pbnQoKSArICAKICAgICAgICBnZW9tX2Vycm9yYmFyKGFlcyh4bWluPXRyb3BvbmluX21pbiwgeG1heD10cm9wb25pbl9tYXgpLCB3aWR0aD0uMiwgcG9zaXRpb249cG9zaXRpb25fZG9kZ2UoLjkpKSArIGxpbXMoeCA9IGMoMCw3MDAwKSkgKyAKICAgICAgICB0aGVtZV9idygpICsgbGFicyh0aXRsZSA9ICJUcm9wb25pbiIsIHkgPSAiY29ob3J0IiwgeCA9ICIiKSAgKwogICAgICAgIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGNvX3Ryb3BvLCBsaW5ldHlwZSA9ICJkYXNoZWQiLCBjb2xvciA9ICJibGFjayIpICArIHRoZW1lKGxlZ2VuZC5qdXN0aWZpY2F0aW9uID0gYygxLCAxKSwgbGVnZW5kLnBvc2l0aW9uID0gYygwLjk4LCAwLjk4KSwgbGVnZW5kLnRpdGxlPWVsZW1lbnRfYmxhbmsoKSkgKwogICAgICAgIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSB3ZXNfcGFsZXR0ZSgiUm95YWwxIikpCgpwX3Ryb3BvbmluX3NpbmdsZSA8LSBnZ3Bsb3QodHJvcG9uaW5fY29sbGFwc2Vfc2luZ2xlLCBhZXMoeCA9IGFzLm51bWVyaWModHJvcG9uaW5fbWF4KSwgeSA9IGNvaG9ydF9pZCkpICsKICAgICAgZ2VvbV92aW9saW4oZmlsbCA9IHdlc19wYWxldHRlKCJEYXJqZWVsaW5nMiIpWzRdKSArIAogICAgICBnZW9tX2JveHBsb3Qod2lkdGg9LjMsIGZpbGwgPSB3ZXNfcGFsZXR0ZSgiRGFyamVlbGluZzIiKVsxXSkgKyAKICAgICAgdGhlbWVfYncoKSArIGdlb21fYmVlc3dhcm0oZ3JvdXBPblg9RkFMU0UsIGFscGhhID0gMC41KSArIGxhYnMoeSA9ICIiLCB4ID0gIlRyb3BvbmluIChuZy9MKSIsIHN1YnRpdGxlID0gcGFzdGUwKCJtaXNzaW5nIGRhdGEgZm9yICIsIHRyb3BvbmluX21pc3NpbmcsICIgY2FzZXMiKSkgKyBsaW1zKHggPSBjKDAsNzAwMCkpICsKICAgICAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gY29fdHJvcG8sIGxpbmV0eXBlID0gImRhc2hlZCIsIGNvbG9yID0gImJsYWNrIikgCgp0cm9wb25pbl9ncmlkIDwtIHBsb3RfZ3JpZChwX3Ryb3BvbmluX2NvaG9ydCwgcF90cm9wb25pbl9zaW5nbGUsIGFsaWduID0gInYiLCBucm93ID0gMiwgcmVsX2hlaWdodHMgPSBjKDIvMywgMS8zKSkKdHJvcG9uaW5fZ3JpZApgYGAKCgojIyMgSUwtNgpOb3RlOiBUaGUgY2FzZXMgZnJvbSBQb3VsZXR0eSBldCBhbCBhcmUgYWRkZWQgdG8gdGhlIHNpbmdsZSBjYXNlcyBhcyB0aGV5IHJlcG9ydCBvbiBJTDYgdmFsdWVzLiAKCmBgYHtyfQpJTDZfY29sbGFwc2VfY29ob3J0IDwtIGNvbGxhcHNlX2xhYnZhbHNfY29ob3J0KGRmX2NvaG9ydF9jb250cm9scywgIm1heCIsICJJTDYiKQpJTDZfY29sbGFwc2Vfc2luZ2xlIDwtIGNvbGxhcHNlX2xhYnZhbHNfc2luZ2xlKGRmX3NpbmdsZWNhc2VzX2luY2xQb3VsZXR0eSwgIm1heCIsICJJTDYiKQpJTDZfbWlzc2luZyA8LSBzdW0oaXMubmEoSUw2X2NvbGxhcHNlX3NpbmdsZSRJTDZfbWF4KSkKCnBfSUw2X2NvaG9ydCA8LSBnZ3Bsb3QoSUw2X2NvbGxhcHNlX2NvaG9ydCwgYWVzKHkgPSBjb2hvcnRfaWQsIHggPSBJTDZfbWVkKSkgKyAKICAgICAgICBnZW9tX3BvaW50KCkgKyAgCiAgICAgICAgZ2VvbV9lcnJvcmJhcihhZXMoeG1pbj1JTDZfbWluLCB4bWF4PUlMNl9tYXgpLCB3aWR0aD0uMiwgcG9zaXRpb249cG9zaXRpb25fZG9kZ2UoLjkpKSArIGxpbXMoeCA9IGMoMCwyNTAwKSkgKyAKICAgICAgICB0aGVtZV9idygpICsgbGFicyh0aXRsZSA9ICJJTDYiLCB5ID0gImNvaG9ydCIsIHggPSAiIikgICsKICAgICAgICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBjb19JTDYsIGxpbmV0eXBlID0gImRhc2hlZCIsIGNvbG9yID0gImJsYWNrIikgICsKICAgICAgICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gd2VzX3BhbGV0dGUoIlJveWFsMSIpKQoKcF9JTDZfc2luZ2xlIDwtIGdncGxvdChJTDZfY29sbGFwc2Vfc2luZ2xlLCBhZXMoeCA9IGFzLm51bWVyaWMoSUw2X21heCksIHkgPSBjb2hvcnRfaWQpKSArCiAgICAgIGdlb21fdmlvbGluKGZpbGwgPSB3ZXNfcGFsZXR0ZSgiRGFyamVlbGluZzIiKVs0XSkgKyAKICAgICAgZ2VvbV9ib3hwbG90KHdpZHRoPS4zLCBmaWxsID0gd2VzX3BhbGV0dGUoIkRhcmplZWxpbmcyIilbMV0pICsgCiAgICAgIHRoZW1lX2J3KCkgKyBnZW9tX2JlZXN3YXJtKGdyb3VwT25YPUZBTFNFLCBhbHBoYSA9IDAuNSkgKyBsYWJzKHkgPSAiIiwgeCA9ICJJTDYgKHBnL21sKSIsIHN1YnRpdGxlID0gcGFzdGUwKCJtaXNzaW5nIGRhdGEgZm9yICIsIElMNl9taXNzaW5nLCAiIGNhc2VzIikpICsgbGltcyh4ID0gYygwLDI1MDApKSArCiAgICAgIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGNvX0lMNiwgbGluZXR5cGUgPSAiZGFzaGVkIiwgY29sb3IgPSAiYmxhY2siKSAKCklMNl9ncmlkIDwtIHBsb3RfZ3JpZChwX0lMNl9jb2hvcnQsIHBfSUw2X3NpbmdsZSwgYWxpZ24gPSAidiIsIG5yb3cgPSAyLCByZWxfaGVpZ2h0cyA9IGMoMi8zLCAxLzMpKQpJTDZfZ3JpZApgYGAKCgojIyMgQk5QCgpgYGB7cn0KY29sbGFwc2VfY29ob3J0IDwtIGNvbGxhcHNlX2xhYnZhbHNfY29ob3J0KGRmX2NvaG9ydF9jb250cm9scywgIm1heCIsICJfQk5QIikKY29sbGFwc2Vfc2luZ2xlIDwtIGNvbGxhcHNlX2xhYnZhbHNfc2luZ2xlKGRmX3NpbmdsZWNhc2VzLCAibWF4IiwgIl9CTlAiKQptaXNzaW5nIDwtIHN1bShpcy5uYShjb2xsYXBzZV9zaW5nbGUkYF9CTlBfbWF4YCkpCgpwX0JOUF9jb2hvcnQgPC0gZ2dwbG90KGNvbGxhcHNlX2NvaG9ydCwgYWVzKHkgPSBjb2hvcnRfaWQsIHggPSBgX0JOUF9tZWRgLCBjb2wgPSBjb2hvcnRfdHlwZSkpICsgCiAgICAgICAgZ2VvbV9wb2ludCgpICsgIAogICAgICAgIGdlb21fZXJyb3JiYXIoYWVzKHhtaW49YF9CTlBfbWluYCwgeG1heD1gX0JOUF9tYXhgKSwgd2lkdGg9LjIsIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKC45KSkgKyBsaW1zKHggPSBjKDAsMjAwMDApKSArIAogICAgICAgIHRoZW1lX2J3KCkgKyBsYWJzKHRpdGxlID0gIkJOUCIsIHkgPSAiY29ob3J0IiwgeCA9ICIiKSAgKwogICAgICAgIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGNvX0JOUCwgbGluZXR5cGUgPSAiZGFzaGVkIiwgY29sb3IgPSAiYmxhY2siKSAgK3RoZW1lKGxlZ2VuZC5qdXN0aWZpY2F0aW9uID0gYygxLCAxKSwgbGVnZW5kLnBvc2l0aW9uID0gYygwLjk4LCAwLjk4KSkgKwogICAgICAgIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSB3ZXNfcGFsZXR0ZSgiUm95YWwxIikpCgpwX0JOUF9zaW5nbGUgPC0gZ2dwbG90KGNvbGxhcHNlX3NpbmdsZSwgYWVzKHggPSBhcy5udW1lcmljKGBfQk5QX21heGApLCB5ID0gY29ob3J0X2lkKSkgKwogICAgICBnZW9tX3Zpb2xpbihmaWxsID0gd2VzX3BhbGV0dGUoIkRhcmplZWxpbmcyIilbNF0pICsgCiAgICAgIGdlb21fYm94cGxvdCh3aWR0aD0uMywgZmlsbCA9IHdlc19wYWxldHRlKCJEYXJqZWVsaW5nMiIpWzFdKSArIAogICAgICB0aGVtZV9idygpICsgZ2VvbV9iZWVzd2FybShncm91cE9uWD1GQUxTRSwgYWxwaGEgPSAwLjUpICsgbGFicyh5ID0gIiIsIHggPSAiQk5QIChwZy9tbCkiLCBzdWJ0aXRsZSA9IHBhc3RlMCgibWlzc2luZyBkYXRhIGZvciAiLCBtaXNzaW5nLCAiIGNhc2VzIikpICsgbGltcyh4ID0gYygwLDIwMDAwKSkgKwogICAgICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBjb19CTlAsIGxpbmV0eXBlID0gImRhc2hlZCIsIGNvbG9yID0gImJsYWNrIikgCgpCTlBfZ3JpZCA8LSBwbG90X2dyaWQocF9CTlBfY29ob3J0LCBwX0JOUF9zaW5nbGUsIGFsaWduID0gInYiLCBucm93ID0gMiwgcmVsX2hlaWdodHMgPSBjKDIvMywgMS8zKSkKQk5QX2dyaWQKYGBgCgojIyMgTlRwcm9CTlAKYGBge3J9CmNvbGxhcHNlX2NvaG9ydCA8LSBjb2xsYXBzZV9sYWJ2YWxzX2NvaG9ydChkZl9jb2hvcnRfY29udHJvbHMsICJtYXgiLCAiTlRwcm9CTlAiKQpjb2xsYXBzZV9zaW5nbGUgPC0gY29sbGFwc2VfbGFidmFsc19zaW5nbGUoZGZfc2luZ2xlY2FzZXMsICJtYXgiLCAiTlRwcm9CTlAiKQptaXNzaW5nIDwtIHN1bShpcy5uYShjb2xsYXBzZV9zaW5nbGUkTlRwcm9CTlBfbWF4KSkKCnBfTlRwcm9CTlBfY29ob3J0IDwtIGdncGxvdChjb2xsYXBzZV9jb2hvcnQsIGFlcyh5ID0gY29ob3J0X2lkLCB4ID0gTlRwcm9CTlBfbWVkLCBjb2wgPSBjb2hvcnRfdHlwZSkpICsgCiAgICAgICAgZ2VvbV9wb2ludCgpICsgIAogICAgICAgIGdlb21fZXJyb3JiYXIoYWVzKHhtaW49TlRwcm9CTlBfbWluLCB4bWF4PU5UcHJvQk5QX21heCksIHdpZHRoPS4yLCBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSguOSkpICsgbGltcyh4ID0gYygwLDcwMDAwKSkgKyAKICAgICAgICB0aGVtZV9idygpICsgbGFicyh0aXRsZSA9ICJOVHByb0JOUCIsIHkgPSAiY29ob3J0IiwgeCA9ICIiKSAgKwogICAgICAgIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGNvX05UcHJvQk5QLCBsaW5ldHlwZSA9ICJkYXNoZWQiLCBjb2xvciA9ICJibGFjayIpICsgdGhlbWUobGVnZW5kLmp1c3RpZmljYXRpb24gPSBjKDEsIDEpLCBsZWdlbmQucG9zaXRpb24gPSBjKDAuOTgsIDAuOTgpLCBsZWdlbmQudGl0bGU9ZWxlbWVudF9ibGFuaygpKSArCiAgICAgICAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IHdlc19wYWxldHRlKCJSb3lhbDEiKSkKCnBfTlRwcm9CTlBfc2luZ2xlIDwtIGdncGxvdChjb2xsYXBzZV9zaW5nbGUsIGFlcyh4ID0gYXMubnVtZXJpYyhOVHByb0JOUF9tYXgpLCB5ID0gY29ob3J0X2lkKSkgKwogICAgICBnZW9tX3Zpb2xpbihmaWxsID0gd2VzX3BhbGV0dGUoIkRhcmplZWxpbmcyIilbNF0pICsgCiAgICAgIGdlb21fYm94cGxvdCh3aWR0aD0uMywgZmlsbCA9IHdlc19wYWxldHRlKCJEYXJqZWVsaW5nMiIpWzFdKSArIAogICAgICB0aGVtZV9idygpICsgZ2VvbV9iZWVzd2FybShncm91cE9uWD1GQUxTRSwgYWxwaGEgPSAwLjUpICsgbGFicyh5ID0gIiIsIHggPSAiTlRwcm9CTlAgKHBnL21sKSIsIHN1YnRpdGxlID0gcGFzdGUwKCJtaXNzaW5nIGRhdGEgZm9yICIsIG1pc3NpbmcsICIgY2FzZXMiKSkgKyBsaW1zKHggPSBjKDAsNzAwMDApKSArCiAgICAgIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGNvX05UcHJvQk5QLCBsaW5ldHlwZSA9ICJkYXNoZWQiLCBjb2xvciA9ICJibGFjayIpIAoKTlRwcm9CTlBfZ3JpZCA8LSBwbG90X2dyaWQocF9OVHByb0JOUF9jb2hvcnQsIHBfTlRwcm9CTlBfc2luZ2xlLCBhbGlnbiA9ICJ2IiwgbnJvdyA9IDIsIHJlbF9oZWlnaHRzID0gYygyLzMsIDEvMykpCk5UcHJvQk5QX2dyaWQKYGBgCgoKIyMjIFBsYXRlbGV0cwoKYGBge3J9CmNvbGxhcHNlX2NvaG9ydCA8LSBjb2xsYXBzZV9sYWJ2YWxzX2NvaG9ydChkZl9jb2hvcnRfY29udHJvbHMsICJtaW4iLCAicGxhdGVsZXQiKQpjb2xsYXBzZV9zaW5nbGUgPC0gY29sbGFwc2VfbGFidmFsc19zaW5nbGUoZGZfc2luZ2xlY2FzZXMsICJtaW4iLCAicGxhdGVsZXQiKQptaXNzaW5nIDwtIHN1bShpcy5uYShjb2xsYXBzZV9zaW5nbGUkcGxhdGVsZXRfbWluKSkKCnBfcGxhdGVsZXRfY29ob3J0IDwtIGdncGxvdChjb2xsYXBzZV9jb2hvcnQsIGFlcyh5ID0gY29ob3J0X2lkLCB4ID0gcGxhdGVsZXRfbWVkLCBjb2wgPSBjb2hvcnRfdHlwZSkpICsgCiAgICAgICAgZ2VvbV9wb2ludCgpICsgIAogICAgICAgIGdlb21fZXJyb3JiYXIoYWVzKHhtaW49cGxhdGVsZXRfbWluLCB4bWF4PXBsYXRlbGV0X21heCwgY29sPWNvaG9ydF90eXBlKSwgd2lkdGg9LjIsIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKC45KSkgKyBsaW1zKHggPSBjKDAsNzUwMDAwKSkgKyAKICAgICAgICB0aGVtZV9idygpICsgbGFicyh0aXRsZSA9ICJwbGF0ZWxldCIsIHkgPSAiY29ob3J0IiwgeCA9ICIiKSAgKwogICAgICAgIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGNvX3BsYXRlbGV0LCBsaW5ldHlwZSA9ICJkYXNoZWQiLCBjb2xvciA9ICJibGFjayIpICArIHRoZW1lKGxlZ2VuZC5qdXN0aWZpY2F0aW9uID0gYygxLCAxKSwgbGVnZW5kLnBvc2l0aW9uID0gYygwLjk4LCAwLjk4KSwgbGVnZW5kLnRpdGxlPWVsZW1lbnRfYmxhbmsoKSkgKwogICAgICAgIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSB3ZXNfcGFsZXR0ZSgiUm95YWwxIikpCgpwX3BsYXRlbGV0X3NpbmdsZSA8LSBnZ3Bsb3QoY29sbGFwc2Vfc2luZ2xlLCBhZXMoeCA9IGFzLm51bWVyaWMocGxhdGVsZXRfbWluKSwgeSA9IGNvaG9ydF9pZCkpICsKICAgICAgZ2VvbV92aW9saW4oZmlsbCA9IHdlc19wYWxldHRlKCJEYXJqZWVsaW5nMiIpWzRdKSArIAogICAgICBnZW9tX2JveHBsb3Qod2lkdGg9LjMsIGZpbGwgPSB3ZXNfcGFsZXR0ZSgiRGFyamVlbGluZzIiKVsxXSkgKyAKICAgICAgdGhlbWVfYncoKSArIGdlb21fYmVlc3dhcm0oZ3JvdXBPblg9RkFMU0UsIGFscGhhID0gMC41KSArIGxhYnMoeSA9ICIiLCB4ID0gIlBsYXRlbGV0cyAoL8K1TCkiLCBzdWJ0aXRsZSA9IHBhc3RlMCgibWlzc2luZyBkYXRhIGZvciAiLCBtaXNzaW5nLCAiIGNhc2VzIikpICsgbGltcyh4ID0gYygwLDc1MDAwMCkpICsKICAgICAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gY29fcGxhdGVsZXQsIGxpbmV0eXBlID0gImRhc2hlZCIsIGNvbG9yID0gImJsYWNrIikgCgpwbGF0ZWxldF9ncmlkIDwtIHBsb3RfZ3JpZChwX3BsYXRlbGV0X2NvaG9ydCwgcF9wbGF0ZWxldF9zaW5nbGUsIGFsaWduID0gInYiLCBucm93ID0gMiwgcmVsX2hlaWdodHMgPSBjKDIvMywgMS8zKSkKcGxhdGVsZXRfZ3JpZApgYGAKCgojIyMgRC1kaW1lcnMKCmBgYHtyfQpjb2xsYXBzZV9jb2hvcnQgPC0gY29sbGFwc2VfbGFidmFsc19jb2hvcnQoZGZfY29ob3J0X2NvbnRyb2xzLCAibWF4IiwgIkRkaW0iKQpjb2xsYXBzZV9zaW5nbGUgPC0gY29sbGFwc2VfbGFidmFsc19zaW5nbGUoZGZfc2luZ2xlY2FzZXMsICJtYXgiLCAiRGRpbSIpCm1pc3NpbmcgPC0gc3VtKGlzLm5hKGNvbGxhcHNlX3NpbmdsZSREZGltX21heCkpCgpwX0RkaW1fY29ob3J0IDwtIGdncGxvdChjb2xsYXBzZV9jb2hvcnQsIGFlcyh5ID0gY29ob3J0X2lkLCB4ID0gRGRpbV9tZWQsIGNvbCA9IGNvaG9ydF90eXBlKSkgKyAKICAgICAgICBnZW9tX3BvaW50KCkgKyAgCiAgICAgICAgZ2VvbV9lcnJvcmJhcihhZXMoeG1pbj1EZGltX21pbiwgeG1heD1EZGltX21heCwgY29sPWNvaG9ydF90eXBlKSwgd2lkdGg9LjIsIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKC45KSkgKyBsaW1zKHggPSBjKDAsMTEwMDApKSArIAogICAgICAgIHRoZW1lX2J3KCkgKyBsYWJzKHRpdGxlID0gIkQtZGltZXJzIiwgeSA9ICJjb2hvcnQiLCB4ID0gIiIpICArCiAgICAgICAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gY29fRGRpbSwgbGluZXR5cGUgPSAiZGFzaGVkIiwgY29sb3IgPSAiYmxhY2siKSAgKyB0aGVtZShsZWdlbmQuanVzdGlmaWNhdGlvbiA9IGMoMSwgMSksIGxlZ2VuZC5wb3NpdGlvbiA9IGMoMC45OCwgMC45OCksIGxlZ2VuZC50aXRsZT1lbGVtZW50X2JsYW5rKCkpICsKICAgICAgICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gd2VzX3BhbGV0dGUoIlJveWFsMSIpKQoKcF9EZGltX3NpbmdsZSA8LSBnZ3Bsb3QoY29sbGFwc2Vfc2luZ2xlLCBhZXMoeCA9IGFzLm51bWVyaWMoRGRpbV9tYXgpLCB5ID0gY29ob3J0X2lkKSkgKwogICAgICBnZW9tX3Zpb2xpbihmaWxsID0gd2VzX3BhbGV0dGUoIkRhcmplZWxpbmcyIilbNF0pICsgCiAgICAgIGdlb21fYm94cGxvdCh3aWR0aD0uMywgZmlsbCA9IHdlc19wYWxldHRlKCJEYXJqZWVsaW5nMiIpWzFdKSArIAogICAgICB0aGVtZV9idygpICsgZ2VvbV9iZWVzd2FybShncm91cE9uWD1GQUxTRSwgYWxwaGEgPSAwLjUpICsgbGFicyh5ID0gIiIsIHggPSAiRC1kaW1lcnMgKG5nL21sKSIsIHN1YnRpdGxlID0gcGFzdGUwKCJtaXNzaW5nIGRhdGEgZm9yICIsIG1pc3NpbmcsICIgY2FzZXMiKSkgKyBsaW1zKHggPSBjKDAsMTEwMDApKSArCiAgICAgIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGNvX0RkaW0sIGxpbmV0eXBlID0gImRhc2hlZCIsIGNvbG9yID0gImJsYWNrIikgCgpEZGltX2dyaWQgPC0gcGxvdF9ncmlkKHBfRGRpbV9jb2hvcnQsIHBfRGRpbV9zaW5nbGUsIGFsaWduID0gInYiLCBucm93ID0gMiwgcmVsX2hlaWdodHMgPSBjKDIvMywgMS8zKSkKRGRpbV9ncmlkCmBgYAoKCiMjIyBTb2RpdW0KCmBgYHtyfQpjb2xsYXBzZV9jb2hvcnQgPC0gY29sbGFwc2VfbGFidmFsc19jb2hvcnQoZGZfY29ob3J0X2NvbnRyb2xzLCAibWluIiwgInNvZGl1bSIpCmNvbGxhcHNlX3NpbmdsZSA8LSBjb2xsYXBzZV9sYWJ2YWxzX3NpbmdsZShkZl9zaW5nbGVjYXNlcywgIm1pbiIsICJzb2RpdW0iKQptaXNzaW5nIDwtIHN1bShpcy5uYShjb2xsYXBzZV9zaW5nbGUkc29kaXVtX21pbikpCgpwX3NvZGl1bV9jb2hvcnQgPC0gZ2dwbG90KGNvbGxhcHNlX2NvaG9ydCwgYWVzKHkgPSBjb2hvcnRfaWQsIHggPSBzb2RpdW1fbWVkLCBjb2wgPSBjb2hvcnRfdHlwZSkpICsgCiAgICAgICAgZ2VvbV9wb2ludCgpICsgIAogICAgICAgIGdlb21fZXJyb3JiYXIoYWVzKHhtaW49c29kaXVtX21pbiwgeG1heD1zb2RpdW1fbWF4LCBjb2w9Y29ob3J0X3R5cGUpLCB3aWR0aD0uMiwgcG9zaXRpb249cG9zaXRpb25fZG9kZ2UoLjkpKSArIGxpbXMoeCA9IGMoMTAwLDIwMCkpICsgCiAgICAgICAgdGhlbWVfYncoKSArIGxhYnModGl0bGUgPSAiU29kaXVtIiwgeSA9ICJjb2hvcnQiLCB4ID0gIiIpICArCiAgICAgICAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gY29fc29kaXVtLCBsaW5ldHlwZSA9ICJkYXNoZWQiLCBjb2xvciA9ICJibGFjayIpICArIHRoZW1lKGxlZ2VuZC5qdXN0aWZpY2F0aW9uID0gYygxLCAxKSwgbGVnZW5kLnBvc2l0aW9uID0gYygwLjk4LCAwLjk4KSwgbGVnZW5kLnRpdGxlPWVsZW1lbnRfYmxhbmsoKSkgKwogICAgICAgIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSB3ZXNfcGFsZXR0ZSgiUm95YWwxIikpCgpwX3NvZGl1bV9zaW5nbGUgPC0gZ2dwbG90KGNvbGxhcHNlX3NpbmdsZSwgYWVzKHggPSBhcy5udW1lcmljKHNvZGl1bV9taW4pLCB5ID0gY29ob3J0X2lkKSkgKwogICAgICBnZW9tX3Zpb2xpbihmaWxsID0gd2VzX3BhbGV0dGUoIkRhcmplZWxpbmcyIilbNF0pICsgCiAgICAgIGdlb21fYm94cGxvdCh3aWR0aD0uMywgZmlsbCA9IHdlc19wYWxldHRlKCJEYXJqZWVsaW5nMiIpWzFdKSArIAogICAgICB0aGVtZV9idygpICsgZ2VvbV9iZWVzd2FybShncm91cE9uWD1GQUxTRSwgYWxwaGEgPSAwLjUpICsgbGFicyh5ID0gIiIsIHggPSAiU29kaXVtIChtbW9sL0wpIiwgc3VidGl0bGUgPSBwYXN0ZTAoIm1pc3NpbmcgZGF0YSBmb3IgIiwgbWlzc2luZywgIiBjYXNlcyIpKSArIGxpbXMoeCA9IGMoMTAwLDIwMCkpICsKICAgICAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gY29fc29kaXVtLCBsaW5ldHlwZSA9ICJkYXNoZWQiLCBjb2xvciA9ICJibGFjayIpIAoKc29kaXVtX2dyaWQgPC0gcGxvdF9ncmlkKHBfc29kaXVtX2NvaG9ydCwgcF9zb2RpdW1fc2luZ2xlLCBhbGlnbiA9ICJ2IiwgbnJvdyA9IDIsIHJlbF9oZWlnaHRzID0gYygyLzMsIDEvMykpCnNvZGl1bV9ncmlkCmBgYAoKCiMjIENyaXRpY2FsIGNhcmUgaW50ZXJ2ZW50aW9ucwoKIyMjIElub3Ryb3BlcwpgYGB7cn0KbWFrZUJhcnBsb3QodmFyX2lkX2NvaG9ydCA9ICJjcml0Y2FyZV9pbm90cm9wX24iLCB2YXJfaWRfc2luZ2xlID0gImNyaXRjYXJlX2lub3Ryb3AiLCB2YXJfaWQgPSAiaW5vdHJvcGVzIikKYGBgCgpgYGB7cn0KbWFrZUhlYXRtYXBfY29ob3J0KCJjcml0Y2FyZSIsICJjcml0Y2FyZSIsZXhjbHVkZV9zaW5nbGUgPSAiZGF5cyIsIHBsb3R0aXRsZSA9ICJDYXNlcyByZWNlaXZpbmcgY3JpdGljYWwgY2FyZSBpbnRlcnZlbnRpb25zLCBwZXIgY29ob3J0IikKCmJhclN5bXAoImNyaXRjYXJlIiwgImNyaXRjYXJlIiwgZXhjbHVkZV9zaW5nbGUgPSAiZGF5cyIsIHBsb3R0aXRsZSA9ICJDYXNlcyByZWNlaXZpbmcgY3JpdGljYWwgY2FyZSBpbnRlcnZlbnRpb25zIikKYGBgCgojIyBUcmVhdG1lbnRzCiMjIyBJVklnCmBgYHtyfQptYWtlQmFycGxvdCh2YXJfaWRfY29ob3J0ID0gInJ4X0lWSWdfb25jZV9uIiwgdmFyX2lkX3NpbmdsZSA9ICJyeF9JVklnX29uY2UiLCB2YXJfaWQgPSAiSVZJZyIpCmBgYAoKIyMjIE92ZXJhbGwgdGhlcmFweQpgYGB7cn0KbWFrZUhlYXRtYXBfY29ob3J0KCJyeCIsICJyeCIsZXhjbHVkZV9zaW5nbGUgPSAiZGF5cyIsIHBsb3R0aXRsZSA9ICJDYXNlcyByZWNlaXZpbmcgdHJlYXRtZW50LCBwZXIgY29ob3J0IikKCgpiYXJTeW1wKCJyeCIsICJyeCIsIGV4Y2x1ZGVfc2luZ2xlID0gImRheXMiLCBwbG90dGl0bGUgPSAiQ2FzZXMgcmVjZWl2aW5nIHRyZWF0bWVudCIpCmBgYAoKCiMgQ2FzZSBkZWZpbml0aW9ucwojIyBMYWIgcmVmZXJlbmNlIHZhbHVlcwpDdXQtb2ZmcyBpbiB0aGlzIHN0dWR5OgoKLSBOZXV0cm9waGlsaWEgPiA4MDAwL8K1TAotIEVsZXZhdGVkIENSUCA+IDEwIG1nL0wKLSBMeW1waG9wZW5pYSA8IDEyNTAvwrVMCi0gV0JDID4gMTEwMDAvwrVMCi0gRmlicmlub2dlbiA+IDQwMCBtZy9kTAotIEQtZGltZXJzID4gMjUwIG5nL21MCi0gRmVycml0aW4gPiAzMDAgbmcvbUwKLSBBbGJ1bWluIDwgMzQgZy9MCi0gUHJvY2FsY2l0b25pbiA+IDAuNDkgbmcvbUwKLSBMREggPiAyODAgVS9MCi0gSUw2ID4gMTYuNCBwZy9tTAotIEVTUiA+IDIyIG1tLwotIEJOUCA+IDEwMCBwZy9tTAotIE5UcHJvQk5QID4gNDAwIHBnL21MCi0gVHJvcG9uaW4gPiAwLjA0IG5nL21MCgojIyBQSU1TLVRTCltTb3VyY2UgUkNQQ0hdKGh0dHBzOi8vd3d3LnJjcGNoLmFjLnVrL3NpdGVzL2RlZmF1bHQvZmlsZXMvMjAyMC0wNS9DT1ZJRC0xOS1QYWVkaWF0cmljLW11bHRpc3lzdGVtLSUyMGluZmxhbW1hdG9yeSUyMHN5bmRyb21lLTIwMjAwNTAxLnBkZikgIAoKMS4gQSBjaGlsZCBwcmVzZW50aW5nIHdpdGggcGVyc2lzdGVudCBmZXZlciwgaW5mbGFtbWF0aW9uIChuZXV0cm9waGlsaWEsIGVsZXZhdGVkIENSUCBhbmQgbHltcGhvcGFlbmlhKSBhbmQgZXZpZGVuY2Ugb2Ygc2luZ2xlIG9yIG11bHRpLW9yZ2FuIGR5c2Z1bmN0aW9uIChzaG9jaywgY2FyZGlhYywgcmVzcGlyYXRvcnksIHJlbmFsLCBnYXN0cm9pbnRlc3RpbmFsIG9yIG5ldXJvbG9naWNhbCBkaXNvcmRlcikgd2l0aCBhZGRpdGlvbmFsIGZlYXR1cmVzIChzZWUgbGlzdGVkIGluIEFwcGVuZGl4IDEgKS4gVGhpcyBtYXkgaW5jbHVkZSBjaGlsZHJlbiBmdWxmaWxsaW5nIGZ1bGwgb3IgcGFydGlhbCBjcml0ZXJpYSBmb3IgS2F3YXNha2kgZGlzZWFzZS4KMi4gRXhjbHVzaW9uIG9mIGFueSBvdGhlciBtaWNyb2JpYWwgY2F1c2UsIGluY2x1ZGluZyBiYWN0ZXJpYWwgc2Vwc2lzLCBzdGFwaHlsb2NvY2NhbCBvciBzdHJlcHRvY29jY2FsIHNob2NrIHN5bmRyb21lcywgaW5mZWN0aW9ucyBhc3NvY2lhdGVkIHdpdGggbXlvY2FyZGl0aXMgc3VjaCBhcyBlbnRlcm92aXJ1cyAod2FpdGluZyBmb3IgcmVzdWx0cyBvZiB0aGVzZSBpbnZlc3RpZ2F0aW9ucyBzaG91bGQgbm90IGRlbGF5IHNlZWtpbmcgZXhwZXJ0IGFkdmljZSkuCjMuIFNBUlMtQ29WLTIgUENSIHRlc3RpbmcgbWF5IGJlIHBvc2l0aXZlIG9yIG5lZ2F0aXZlIAoKV2UgYXJlIHVuYWJsZSB0byBldmFsdWF0ZSBjcml0ZXJpYSAyLgoKYGBge3IsIGZpZy5oZWlnaHQ9IDEwLCBmaWcud2lkdGg9IDh9ClBJTVNfVFNfZnVsZmlsbGVkIDwtIGFwcGx5KGRmX3NpbmdsZWNhc2VzLCAxLCBmdW5jdGlvbihyb3cpIHsKICAgICMgcGVyc2lzdGVudCBmZXZlciwgaW5mbGFtbWF0aW9uIChuZXV0cm9waGlsaWEsIGVsZXZhdGVkIENSUCBhbmQgbHltcGhvcGFlbmlhKSAKICAgIHBhdF9pZCA8LSByb3dbInBhdGllbnRJRF9pbnQiXQogICAgZmV2ZXIgPC0gcm93WyJzeW1wX2ZldmVyIl0gPT0gVFJVRQogICAgbmV1dHJvcGhpbGlhIDwtIGFzLm51bWVyaWMocm93WyJsYWJfbmV1dHJvcGhpbHMiXSkgPiBjb19uZXV0cm9waGlsaWEKICAgIGVsZXZhdGVkX0NSUCA8LSAoYXMubnVtZXJpYyhyb3dbImxhYl9DUlBfYWRtaXMiXSkgPiBjb19DUlAgfCBhcy5udW1lcmljKHJvd1sibGFiX0NSUF9OUyJdKSA+IGNvX0NSUCB8IGFzLm51bWVyaWMocm93WyJsYWJfQ1JQX3BlYWsiXSkgPiBjb19DUlAgKQogICAgbHltcGhvcGVuaWEgPC0gYXMubnVtZXJpYyhyb3dbImxhYl9seW1waG9jeXRlc19sb3dlc3QiXSkgPCBjb19seW1waG8KICAgIGluZmxhbW0gPC0gYW55KGZldmVyLCBuZXV0cm9waGlsaWEsIGVsZXZhdGVkX0NSUCwgbHltcGhvcGVuaWEpCiAgICAKICAgICMgbGFiIHZhbHVlcwogICAgI2ZpYnJpbm9nZW4gPC0gcm93WyJsYWJfZmlicmlubyJdID4gY29fZmlicmlubwogICAgI0RkaW1lcnMgPC0gcm93WyJsYWJfRGRpbV9wZWFrIl0gPiBjb19EZGltIHwgIHJvd1sibGFiX0RkaW1fTlMiXSA+IGNvX0RkaW0KICAgICNmZXJyaXRpbiA8LSAocm93WyJsYWJfZmVycml0aW5fTlMiXSA+IGNvX2ZlcnJpdGluIHwgcm93WyJsYWJfZmVycml0aW5fYWRtaXMiXSA+IGNvX2ZlcnJpdGluIHwgcm93WyJsYWJfZmVycml0aW5fcGVhayJdID4gY29fZmVycml0aW4pCiAgICAjYWxidW1pbiA8LSByb3dbImxhYl9hbGJ1bWluX2FkbWlzIl0gPCBjb19hbGJ1IHwgcm93WyJsYWJfYWxidW1pbl9sb3dlc3QiXSA8IGNvX2FsYnUgfCByb3dbImxhYl9hbGJ1bWluX05TIl0gPCBjb19hbGJ1CiAgICAjbGFiX3ZhbHMgPC0gYW55KGZpYnJpbm9nZW4sIERkaW1lcnMsIGZlcnJpdGluLCBhbGJ1bWluKQogICAgCiAgICAjIHNpbmdsZSBvciBtdWx0aS1vcmdhbiBkeXNmdW5jdGlvbiAoc2hvY2ssIGNhcmRpYWMsIHJlc3BpcmF0b3J5LCByZW5hbCwgZ2FzdHJvaW50ZXN0aW5hbCBvciBuZXVyb2xvZ2ljYWwgZGlzb3JkZXIpCiAgICBwbmV1bW9uaWEgPC0gcm93WyJzeW1wX3Jlc3BfcG5ldW1vbmlhIl0gPT0gVFJVRQogICAgcmVzcF9mYWlsdXJlIDwtIHJvd1sic3ltcF9yZXNwX2ZhaWx1cmUiXSA9PSBUUlVFCiAgICByZXNwIDwtIGFueShwbmV1bW9uaWEsIHJlc3BfZmFpbHVyZSkKICAgIAogICAgQUtJIDwtIHJvd1sic3ltcF9yZW5hbF9BS0kiXSA9PSBUUlVFCiAgICBSUlQgPC0gcm93WyJjcml0Y2FyZV9SUlQiXSA9PSBUUlVFCiAgICByZW5hbCA8LSBhbnkoQUtJLCBSUlQpCiAgICAKICAgIG15b2NhcmRpdGlzIDwtIHJvd1sic3ltcF9jYXJkaW92YXNjX215b2NhcmQiXSA9PSBUUlVFCiAgICBwZXJpY2FyZGl0aXMgPC0gcm93WyJzeW1wX2NhcmRpb3Zhc2NfcGVyaWNhcmQiXSA9PSBUUlVFCiAgICBMVkVGX3VuZGVyMzAgPC0gcm93WyJzeW1wX2NhcmRpb3Zhc2NfTFZfbGVzczMwIl0gPT0gVFJVRQogICAgTFZFRl8zMHRvNTUgPC0gcm93WyJzeW1wX2NhcmRpb3Zhc2NfTFZfMzB0bzU1Il0gPT0gVFJVRQogICAgQk5QIDwtIChhcy5udW1lcmljKHJvd1sibGFiX0JOUF9hZG1pcyJdKSA+IGNvX0JOUCB8IGFzLm51bWVyaWMocm93WyJsYWJfQk5QX21heCJdKSA+IGNvX0JOUCApIAogICAgTlRwcm9CTlAgPC0gYXMubnVtZXJpYyhyb3dbImxhYl9OVHByb0JOUCJdKSA+IGNvX05UcHJvQk5QCiAgICB0cm9wbyA8LSBhcy5udW1lcmljKHJvd1sibGFiX3Ryb3BvbmluX2FkbWlzIl0pID4gY29fdHJvcG8KICAgIHNob2NrIDwtIHJvd1sic3ltcF9jYXJkaW92YXNjX3Nob2NrIl0gPT0gVFJVRQogICAgCiAgICBjYXJkaW92YXNjIDwtIGFueShteW9jYXJkaXRpcywgTFZFRl91bmRlcjMwLCBMVkVGXzMwdG81NSwgTlRwcm9CTlAsIEJOUCwgdHJvcG8sIHNob2NrKQogICAgCiAgICByYXNoIDwtIHJvd1sia2F3YXNha2lfZXhhbnRoZW1hIl0gPT0gVFJVRQogICAgZGVybWF0byA8LSBhbnkocmFzaCkKICAgIAogICAgb3JnYW5fZHlzZnVuYyA8LSBzdW0ocmVzcCwgcmVuYWwsIGNhcmRpb3Zhc2MsIGRlcm1hdG8sIG5hLnJtID0gVFJVRSkgPj0gMQoKICAgIGNyaXRlcmlhX2Z1bGZpbGxlZCA8LSAoaW5mbGFtbSkgJiBvcmdhbl9keXNmdW5jICMmbGFiX3ZhbHMKICAgICNyZXR1cm4oYyhwYXRfaWQsICJjcml0ZXJpYTFfaW5mbGFtbSIgPSBpbmZsYW1tLCAiY3JpdGVyaWEyX2xhYnZhbHMiID0gbGFiX3ZhbHMsICJjcml0ZXJpYTNfb3JnYW5keXNmdW5jIiA9IG9yZ2FuX2R5c2Z1bmMsICJjcml0ZXJpYV9mdWxmaWxsZWQiID0gY3JpdGVyaWFfZnVsZmlsbGVkKSkKICAgIHJldHVybihjKHBhdF9pZCwgImNyaXRlcmlhMV9pbmZsYW1tIiA9IGluZmxhbW0sICJjcml0ZXJpYTNfb3JnYW5keXNmdW5jIiA9IG9yZ2FuX2R5c2Z1bmMsICJjcml0ZXJpYV9mdWxmaWxsZWQiID0gY3JpdGVyaWFfZnVsZmlsbGVkKSkKfSkKClBJTVNfVFNfZnVsZmlsbGVkIDwtIFBJTVNfVFNfZnVsZmlsbGVkICU+JSB0KCkgJT4lIGFzX3RpYmJsZSgpClBJTVNfVFNfZnVsZmlsbGVkIDwtIHR5cGVfY29udmVydChQSU1TX1RTX2Z1bGZpbGxlZCkKUElNU19UU19mdWxmaWxsZWRfaGVhdG1hcCA8LSBQSU1TX1RTX2Z1bGZpbGxlZApjb2xzIDwtIHNhcHBseShQSU1TX1RTX2Z1bGZpbGxlZF9oZWF0bWFwLCBpcy5sb2dpY2FsKQpQSU1TX1RTX2Z1bGZpbGxlZF9oZWF0bWFwWyxjb2xzXSA8LSBsYXBwbHkoUElNU19UU19mdWxmaWxsZWRfaGVhdG1hcFssY29sc10sIGFzLm51bWVyaWMpClBJTVNfVFNfZnVsZmlsbGVkX2hlYXRtYXBfbWVsdCA8LSBQSU1TX1RTX2Z1bGZpbGxlZF9oZWF0bWFwICU+JSBtZWx0KCkKUElNU19UU19mdWxmaWxsZWRfaGVhdG1hcF9tZWx0W2lzLm5hKFBJTVNfVFNfZnVsZmlsbGVkX2hlYXRtYXBfbWVsdCldIDwtIDIKCnNraW0oUElNU19UU19mdWxmaWxsZWQpCgojZ2dwbG90KFBJTVNfVFNfZnVsZmlsbGVkX2hlYXRtYXBfbWVsdCwgYWVzKHggPSB2YXJpYWJsZSwgeSA9IGFzLmNoYXJhY3RlcihwYXRpZW50SURfaW50KSwgZmlsbCA9IGFzLmZhY3Rvcih2YWx1ZSkpKSArIGdlb21fdGlsZSgpICsgdGhlbWVfY2xhc3NpYygpICsgdGhlbWUoYXhpcy5saW5lPWVsZW1lbnRfYmxhbmsoKSkgKyBsYWJzKHkgPSAiUGF0aWVudCBJRCIsIHggPSAiY3JpdGVyaWEiLCBmaWxsID0gImNyaXRlcmlhIG1ldCIsIHRpdGxlID0gIk92ZXJ2aWV3IG9mIHdoaWNoIHNpbmdsZSBjYXNlcyBmdWxmaWxsIFBJTVMtVFMgY2FzZSBkZWZpbml0aW9uIikgKyAgc2NhbGVfZmlsbF9tYW51YWwobGFiZWxzID0gYygiTm8iLCAiWWVzIiwgIk1pc3NpbmciKSwgdmFsdWVzID0gYygicGluazIiLCAicm95YWxibHVlMyIsICJkYXJrZ3JleSIpKSArIHRoZW1lKGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChhbmdsZT05MCwgaGp1c3Q9MSkpCmBgYAoKIyMgQ0RDIE1JUy1DCltTb3VyY2UgQ0RDXShodHRwczovL3d3dy5jZGMuZ292L21pcy1jL2hjcC8pIGFuZCBbVXBUb0RhdGVdKGh0dHBzOi8vd3d3LnVwdG9kYXRlLmNvbS9jb250ZW50cy9pbWFnZT9pbWFnZUtleT1QRURTJTJGMTI4MjAxJnRvcGljS2V5PVBFRFMlMkYxMjc0ODgpClRoZSBjYXNlIGRlZmluaXRpb24gZm9yIE1JUy1DIGlzOgoKMS4gQWdlIDwyMSB5ZWFycwoyLiBDbGluaWNhbCBwcmVzZW50YXRpb24gY29uc2lzdGVudCB3aXRoIE1JUy1DLCBpbmNsdWRpbmcgYWxsIG9mIHRoZSBmb2xsb3dpbmc6CiAgICAtIEZldmVyCiAgICAgICAgLSBEb2N1bWVudGVkIGZldmVyID4zOC4wwrBDICgxMDAuNMKwRikgZm9yIOKJpTI0IGhvdXJzIG9yCiAgICAgICAgLSBSZXBvcnQgb2Ygc3ViamVjdGl2ZSBmZXZlciBsYXN0aW5nIOKJpTI0IGhvdXJzCiAgICAtIExhYm9yYXRvcnkgZXZpZGVuY2Ugb2YgaW5mbGFtbWF0aW9uCiAgICAtIFNldmVyZSBpbGxuZXNzIHJlcXVpcmluZyBob3NwaXRhbGl6YXRpb24KICAgIC0gTXVsdGlzeXN0ZW0gaW52b2x2ZW1lbnQKICAgICAgICAtIDIgb3IgbW9yZSBvcmdhbiBzeXN0ZW1zIGludm9sdmVkCiAgICAgICAgICAgIC0gQ2FyZGlvdmFzY3VsYXIgKGVnLCBzaG9jaywgZWxldmF0ZWQgdHJvcG9uaW4sIGVsZXZhdGVkIEJOUCwgYWJub3JtYWwgZWNob2NhcmRpb2dyYW0sIGFycmh5dGhtaWEpCiAgICAgICAgICAgIC0gUmVzcGlyYXRvcnkgKGVnLCBwbmV1bW9uaWEsIEFSRFMsIHB1bG1vbmFyeSBlbWJvbGlzbSkKICAgICAgICAgICAgLSBSZW5hbCAoZWcsIEFLSSwgcmVuYWwgZmFpbHVyZSkKICAgICAgICAgICAgLSBOZXVyb2xvZ2ljIChlZywgc2VpenVyZSwgc3Ryb2tlLCBhc2VwdGljIG1lbmluZ2l0aXMpCiAgICAgICAgICAgIC0gSGVtYXRvbG9naWMgKGVnLCBjb2FndWxvcGF0aHkpCiAgICAgICAgICAgIC0gR2FzdHJvaW50ZXN0aW5hbCAoZWcsIGVsZXZhdGVkIGxpdmVyIGVuenltZXMsIGRpYXJyaGVhLCBpbGV1cywgZ2FzdHJvaW50ZXN0aW5hbCBibGVlZGluZykKICAgICAgICAgICAgLSBEZXJtYXRvbG9naWMgKGVnLCBlcnl0aHJvZGVybWEsIG11Y29zaXRpcywgb3RoZXIgcmFzaCkKMy4gTm8gYWx0ZXJuYXRpdmUgcGxhdXNpYmxlIGRpYWdub3Nlcwo0LiBSZWNlbnQgb3IgY3VycmVudCBTQVJTLUNvVi0yIGluZmVjdGlvbiBvciBleHBvc3VyZQogICAgLSBBbnkgb2YgdGhlIGZvbGxvd2luZzoKICAgIC0gUG9zaXRpdmUgU0FSUy1Db1YtMiBSVC1QQ1IKICAgIC0gUG9zaXRpdmUgc2Vyb2xvZ3kKICAgIC0gUG9zaXRpdmUgYW50aWdlbiB0ZXN0CiAgICAtIENPVklELTE5IGV4cG9zdXJlIHdpdGhpbiB0aGUgNCB3ZWVrcyBwcmlvciB0byB0aGUgb25zZXQgb2Ygc3ltcHRvbXMKCgoKYGBge3IsIGZpZy5oZWlnaHQ9IDEwLCBmaWcud2lkdGg9IDh9CgpDRENfZnVsZmlsbGVkIDwtIGFwcGx5KGRmX3NpbmdsZWNhc2VzLCAxLCBmdW5jdGlvbihyb3cpIHsKICAgICMgY3JpdGVyaWEgMQogICAgY3JpdGVyaWExID0gVFJVRQogICAgCiAgICAjIGNyaXRlcmlhIDIKICAgIHBhdF9pZCA8LSByb3dbInBhdGllbnRJRF9pbnQiXQogICAgCiAgICAjIGZldmVyPwogICAgZmV2ZXIgPC0gcm93WyJzeW1wX2ZldmVyIl0gPT0gVFJVRSB8IHJvd1sia2F3YXNha2lfZmV2ZXIiXSA9PSBUUlVFCgogICAgaW5mbGFtbSA8LSBhbnkoZmV2ZXIpCiAgICAKICAgICMgbGFiIHZhbHVlcyBldmlkZW5jZSBmb3IgaW5mbGFtbWF0aW9uCiAgICBuZXV0cm9waGlsaWEgPC0gYXMubnVtZXJpYyhyb3dbImxhYl9uZXV0cm9waGlscyJdKSA+IGNvX25ldXRyb3BoaWxpYQogICAgZWxldmF0ZWRfQ1JQIDwtIChhcy5udW1lcmljKHJvd1sibGFiX0NSUF9hZG1pcyJdKSA+IGNvX0NSUCB8IGFzLm51bWVyaWMocm93WyJsYWJfQ1JQX05TIl0pID4gY29fQ1JQIHwgYXMubnVtZXJpYyhyb3dbImxhYl9DUlBfcGVhayJdKSA+IGNvX0NSUCApCiAgICBseW1waG9wZW5pYSA8LSBhcy5udW1lcmljKHJvd1sibGFiX2x5bXBob2N5dGVzX2xvd2VzdCJdKSA8IGNvX2x5bXBobwogICAgZmlicmlub2dlbiA8LSBhcy5udW1lcmljKHJvd1sibGFiX2ZpYnJpbm8iXSkgPiBjb19maWJyaW5vCiAgICBEZGltZXJzIDwtIGFzLm51bWVyaWMocm93WyJsYWJfRGRpbV9wZWFrIl0pID4gY29fRGRpbSB8ICBhcy5udW1lcmljKHJvd1sibGFiX0RkaW1fTlMiXSkgPiBjb19EZGltCiAgICBmZXJyaXRpbiA8LSAoYXMubnVtZXJpYyhyb3dbImxhYl9mZXJyaXRpbl9OUyJdKSA+IGNvX2ZlcnJpdGluIHwgYXMubnVtZXJpYyhyb3dbImxhYl9mZXJyaXRpbl9hZG1pcyJdKSA+IGNvX2ZlcnJpdGluIHwgYXMubnVtZXJpYyhyb3dbImxhYl9mZXJyaXRpbl9wZWFrIl0pID4gY29fZmVycml0aW4pCiAgICBhbGJ1bWluIDwtIGFzLm51bWVyaWMocm93WyJsYWJfYWxidW1pbl9hZG1pcyJdKSA8IGNvX2FsYnUgfCBhcy5udW1lcmljKHJvd1sibGFiX2FsYnVtaW5fbG93ZXN0Il0pIDwgY29fYWxidSB8IGFzLm51bWVyaWMocm93WyJsYWJfYWxidW1pbl9OUyJdKSA8IGNvX2FsYnUKICAgIFBDVCA8LSBhcy5udW1lcmljKHJvd1sibGFiX1BDVF9hZG1pcyJdKSA+IGNvX1BDVCB8IGFzLm51bWVyaWMocm93WyJsYWJfUENUX3BlYWsiXSkgPiBjb19QQ1QgfCBhcy5udW1lcmljKHJvd1sibGFiX1BDVF9OUyJdKSA+IGNvX1BDVCAKICAgIExESCA8LSBhcy5udW1lcmljKHJvd1sibGFiX0xESCJdKSA+IGNvX0xESAogICAgSUw2IDwtIGFzLm51bWVyaWMocm93WyJsYWJfSUw2Il0pID4gY29fSUw2CiAgICBFU1IgPC0gYXMubnVtZXJpYyhyb3dbImxhYl9FU1IiXSkgPiBjb19FU1IKCiAgICBsYWJfdmFscyA8LSBhbnkobmV1dHJvcGhpbGlhLCBlbGV2YXRlZF9DUlAsIGx5bXBob3BlbmlhLCBmaWJyaW5vZ2VuLCBEZGltZXJzLCBmZXJyaXRpbiwgYWxidW1pbiwgUENULCBMREgsIElMNiwgRVNSKQogICAgCiAgICAjIElsbmVzcyByZXF1aXJpbmcgaG9zcGl0YWxpc2F0aW9uCiAgICAjIyB1c2VkIHN1cnJvZ2F0ZSBwYXJhbWV0ZXJzIGZvciBob3NwCiAgICBob3NwX0lDVSA8LSByb3dbImFkbWlzX2hvc3BfZGF5cyJdID4gMSB8IHJvd1siYWRtaXNfSUNVX2RheXMiXSA+IDEgfCByb3dbImFkbWlzX1BJQ1VfYWRtaXMiXSA9PSBUUlVFCiAgICBOSVYgPC0gcm93WyJjcml0Y2FyZV9OSVYiXSA9PSBUUlVFIHwgcm93WyJjcml0Y2FyZV9OSVZfZGF5cyJdID4gMQogICAgTVYgPC0gcm93WyJjcml0Y2FyZV9NViJdID09IFRSVUUgfCByb3dbImNyaXRjYXJlX01WX2RheXMiXSA+IDEKICAgIGlub3Ryb3AgPC0gcm93WyJjcml0Y2FyZV9pbm90cm9wIl0gPT0gVFJVRSB8IHJvd1siY3JpdGNhcmVfaW5vdHJvcF9kYXlzIl0gPiAxCiAgICBFQ01PIDwtIHJvd1siY3JpdGNhcmVfRUNNTyJdID09IFRSVUUgCiAgICBJVklnIDwtIHJvd1sicnhfSVZJZ19vbmNlIl0gPT0gVFJVRSAgfCAgcm93WyJyeF9JVklnX211bHRpcCJdID09IFRSVUUgCiAgICBiaW9sb2dpY2FscyA8LSByb3dbInJ4X2FuYWtpbnJhIl0gPT0gVFJVRSB8IHJvd1sicnhfdG9jaWxpenVtYWIiXSA9PSBUUlVFIHwgcm93WyJyeF9pbmZsaXhpbWFiIl0gPT0gVFJVRSB8IHJvd1sicnhfYW50aWJpb3RpY3MiXSA9PSBUUlVFIHwgcm93WyJyeF9wbGFzbWEiXSA9PSBUUlVFIHwgcm93WyJyeF9yZW1kZXNpdmlyIl0gPT0gVFJVRSAKICAgIGhlcGFyaW4gPC0gcm93WyJyeF9oZXBhcmluIl0gPT0gVFJVRQoKCiAgICByZXFfaG9zcCA8LSBhbnkoaG9zcF9JQ1UsIE5JViwgTVYsIGlub3Ryb3AsIEVDTU8sIElWSWcsIGJpb2xvZ2ljYWxzLCBoZXBhcmluKQogICAgCiAgICAjIyBtdWx0aXN5c3RlbSBpbnZvbHZlbWVudCA+PSAyCiAgICAjIyByZXNwaXJhdG9yeQogICAgcG5ldW1vbmlhIDwtIHJvd1sic3ltcF9yZXNwX3BuZXVtb25pYSJdID09IFRSVUUKICAgIHJlc3BfZmFpbHVyZSA8LSByb3dbInN5bXBfcmVzcF9mYWlsdXJlIl0gPT0gVFJVRQogICAgcmVzcCA8LSBhbnkocG5ldW1vbmlhLCByZXNwX2ZhaWx1cmUpCiAgICAKICAgIEFLSSA8LSByb3dbInN5bXBfcmVuYWxfQUtJIl0gPT0gVFJVRQogICAgUlJUIDwtIHJvd1siY3JpdGNhcmVfUlJUIl0gPT0gVFJVRQogICAgcmVuYWwgPC0gYW55KEFLSSwgUlJUKQogICAgCiAgICBteW9jYXJkaXRpcyA8LSByb3dbInN5bXBfY2FyZGlvdmFzY19teW9jYXJkIl0gPT0gVFJVRQogICAgcGVyaWNhcmRpdGlzIDwtIHJvd1sic3ltcF9jYXJkaW92YXNjX3BlcmljYXJkIl0gPT0gVFJVRQogICAgTFZFRl91bmRlcjMwIDwtIHJvd1sic3ltcF9jYXJkaW92YXNjX0xWX2xlc3MzMCJdID09IFRSVUUKICAgIExWRUZfMzB0bzU1IDwtIHJvd1sic3ltcF9jYXJkaW92YXNjX0xWXzMwdG81NSJdID09IFRSVUUKICAgIEJOUCA8LSAoYXMubnVtZXJpYyhyb3dbImxhYl9CTlBfYWRtaXMiXSkgPiBjb19CTlAgfCBhcy5udW1lcmljKHJvd1sibGFiX0JOUF9tYXgiXSkgPiBjb19CTlAgKSAKICAgIE5UcHJvQk5QIDwtIGFzLm51bWVyaWMocm93WyJsYWJfTlRwcm9CTlAiXSkgPiBjb19OVHByb0JOUAogICAgdHJvcG8gPC0gYXMubnVtZXJpYyhyb3dbImxhYl90cm9wb25pbl9hZG1pcyJdKSA+IGNvX3Ryb3BvCiAgICBzaG9jayA8LSByb3dbInN5bXBfY2FyZGlvdmFzY19zaG9jayJdID09IFRSVUUKICAgIAogICAgY2FyZGlvdmFzYyA8LSBhbnkobXlvY2FyZGl0aXMsIExWRUZfdW5kZXIzMCwgTFZFRl8zMHRvNTUsIE5UcHJvQk5QLCBCTlAsIHRyb3BvLCBzaG9jaykKICAgIAogICAgcmFzaCA8LSByb3dbImthd2FzYWtpX2V4YW50aGVtYSJdID09IFRSVUUKICAgIGRlcm1hdG8gPC0gYW55KHJhc2gpCiAgICAKICAgIG9yZ2FuX2R5c2Z1bmMgPC0gc3VtKHJlc3AsIHJlbmFsLCBjYXJkaW92YXNjLCBkZXJtYXRvLCBuYS5ybSA9IFRSVUUpID49IDIKICAgIAogICAgY3JpdGVyaWEyIDwtIHN1bShpbmZsYW1tLCBsYWJfdmFscywgcmVxX2hvc3AsIG9yZ2FuX2R5c2Z1bmMsIG5hLnJtID0gVFJVRSkgPT0gNAogICAgIyBjcml0ZXJpYSAzCiAgICAjIyBub3QgZXZhbHVhYmxlCiAgICBjcml0ZXJpYTMgPSBUUlVFCiAgICAjIGNyaXRlcmlhIDQKICAgICMgQ09WSUQgcG9zPwogICAgUENSX3BvcyA8LSByb3dbImNvdmlkX1BDUl9wb3MiXSA9PSBUUlVFCiAgICBzdG9vbF9wb3MgPC0gcm93WyJjb3ZpZF9QQ1Jfc3Rvb2xfcG9zIl0gPT0gVFJVRQogICAgY2xvc2Vjb250YWN0IDwtIHJvd1siY292aWRfY2xvc2Vjb250YWN0Il0gPT0gVFJVRQogICAgSWdBIDwtIHJvd1siY292aWRfSWdBX3BvcyJdID09IFRSVUUKICAgIElnTSA8LSByb3dbImNvdmlkX0lnTV9wb3MiXSA9PSBUUlVFICAgIAogICAgSWdHIDwtIHJvd1siY292aWRfSWdHX3BvcyJdID09IFRSVUUgICAgCiAgICBhbnlfc2VybyA8LSByb3dbImNvdmlkX3Nlcm9fcG9zIl0gPT0gVFJVRQogICAgCiAgICBjcml0ZXJpYTQgPC0gYW55KFBDUl9wb3MsIHN0b29sX3BvcywgY2xvc2Vjb250YWN0LCBJZ0EsIElnTSwgSWdHLCBhbnlfc2VybykKICAgIAogICAgaWYgKEZBTFNFICVpbiUgYyhjcml0ZXJpYTEsIGNyaXRlcmlhMiwgY3JpdGVyaWEzLCBjcml0ZXJpYTQpKXsKICAgICAgY3JpdGVyaWFfZnVsZmlsbGVkIDwtIEZBTFNFCiAgICB9IGVsc2UgaWYgKE5BICVpbiUgYyhjcml0ZXJpYTEsIGNyaXRlcmlhMiwgY3JpdGVyaWEzLCBjcml0ZXJpYTQpKXsKICAgICAgY3JpdGVyaWFfZnVsZmlsbGVkIDwtIE5BCiAgICB9IGVsc2UgaWYgKHN1bShjcml0ZXJpYTEsIGNyaXRlcmlhMiwgY3JpdGVyaWEzLCBjcml0ZXJpYTQsIG5hLnJtID0gVFJVRSkgPT0gNCl7CiAgICAgIGNyaXRlcmlhX2Z1bGZpbGxlZCA8LSBUUlVFCiAgICB9CiAgICAKICAgICNjcml0ZXJpYV9mdWxmaWxsZWQgPC0gc3VtKGNyaXRlcmlhMSwgY3JpdGVyaWEyLCBjcml0ZXJpYTMsIGNyaXRlcmlhNCwgbmEucm0gPSBUUlVFKSA9PSA0CiAgICByZXR1cm4oYyhwYXRfaWQsICJjcml0ZXJpYTFfYWdlIiA9IGNyaXRlcmlhMSwgImNyaXRlcmlhMl9jbGluaWNhbCIgPSBjcml0ZXJpYTIsICJjcml0ZXJpYTNfbm9BbHQiID0gY3JpdGVyaWEzLCAiY3JpdGVyaWE0X3JlY2VudEV4cG9zdXJlIiA9IGNyaXRlcmlhNCwgImNyaXRlcmlhX2Z1bGZpbGxlZCIgPSBjcml0ZXJpYV9mdWxmaWxsZWQpKQp9KQoKQ0RDX2Z1bGZpbGxlZCA8LSBDRENfZnVsZmlsbGVkICU+JSB0KCkgJT4lIGFzX3RpYmJsZSgpCkNEQ19mdWxmaWxsZWQgPC0gdHlwZV9jb252ZXJ0KENEQ19mdWxmaWxsZWQpCkNEQ19mdWxmaWxsZWRfaGVhdG1hcCA8LSBDRENfZnVsZmlsbGVkCmNvbHMgPC0gc2FwcGx5KENEQ19mdWxmaWxsZWRfaGVhdG1hcCwgaXMubG9naWNhbCkKQ0RDX2Z1bGZpbGxlZF9oZWF0bWFwWyxjb2xzXSA8LSBsYXBwbHkoQ0RDX2Z1bGZpbGxlZF9oZWF0bWFwWyxjb2xzXSwgYXMubnVtZXJpYykKQ0RDX2Z1bGZpbGxlZF9oZWF0bWFwX21lbHQgPC0gQ0RDX2Z1bGZpbGxlZF9oZWF0bWFwICU+JSBtZWx0KCkKQ0RDX2Z1bGZpbGxlZF9oZWF0bWFwX21lbHRbaXMubmEoQ0RDX2Z1bGZpbGxlZF9oZWF0bWFwX21lbHQpXSA8LSAyCgpza2ltKENEQ19mdWxmaWxsZWQpCiNnZ3Bsb3QoQ0RDX2Z1bGZpbGxlZF9oZWF0bWFwX21lbHQsIGFlcyh4ID0gdmFyaWFibGUsIHkgPSBhcy5jaGFyYWN0ZXIocGF0aWVudElEX2ludCksIGZpbGwgPSBhcy5mYWN0b3IodmFsdWUpKSkgKyBnZW9tX3RpbGUoKSArIHRoZW1lX2NsYXNzaWMoKSArIHRoZW1lKGF4aXMubGluZT1lbGVtZW50X2JsYW5rKCkpICsgbGFicyh5ID0gIlBhdGllbnQgSUQiLCB4ID0gImNyaXRlcmlhIiwgZmlsbCA9ICJjcml0ZXJpYSBtZXQiLCB0aXRsZSA9ICJPdmVydmlldyBvZiB3aGljaCBzaW5nbGUgY2FzZXMgZnVsZmlsbCBDREMgTUlTLUMgY2FzZSBkZWZpbml0aW9uIikgKyAgc2NhbGVfZmlsbF9tYW51YWwobGFiZWxzID0gYygiTm8iLCAiWWVzIiwgIk1pc3NpbmciKSwgdmFsdWVzID0gYygicGluazIiLCAicm95YWxibHVlMyIsICJkYXJrZ3JleSIpKSArIHRoZW1lKGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChhbmdsZT05MCwgaGp1c3Q9MSkpCmBgYAoKIyMgV0hPIGNhc2UgZGVmaW5pdGlvbgpbU291cmNlIFVwVG9EYXRlXShodHRwczovL3d3dy51cHRvZGF0ZS5jb20vY29udGVudHMvaW1hZ2U/aW1hZ2VLZXk9UEVEUyUyRjEyODIwMSZ0b3BpY0tleT1QRURTJTJGMTI3NDg4KToKCkFsbCA2IGNyaXRlcmlhIG11c3QgYmUgbWV0OgoKMS4gQWdlIDAgdG8gMTkgeWVhcnMKMi4gRmV2ZXIgZm9yIOKJpTMgZGF5cwozLiBDbGluaWNhbCBzaWducyBvZiBtdWx0aXN5c3RlbSBpbnZvbHZlbWVudCAoYXQgbGVhc3QgMiBvZiB0aGUgZm9sbG93aW5nKToKICAgIC0gUmFzaCwgYmlsYXRlcmFsIG5vbnB1cnVsZW50IGNvbmp1bmN0aXZpdGlzLCBvciBtdWNvY3V0YW5lb3VzIGluZmxhbW1hdGlvbiBzaWducyAob3JhbCwgaGFuZHMsIG9yIGZlZXQpCiAgICAtIEh5cG90ZW5zaW9uIG9yIHNob2NrCiAgICAtIENhcmRpYWMgZHlzZnVuY3Rpb24sIHBlcmljYXJkaXRpcywgdmFsdnVsaXRpcywgb3IgY29yb25hcnkgYWJub3JtYWxpdGllcyAoaW5jbHVkaW5nIGVjaG9jYXJkaW9ncmFwaGljIGZpbmRpbmdzIG9yIGVsZXZhdGVkIHRyb3BvbmluL0JOUCkKICAgIC0gRXZpZGVuY2Ugb2YgY29hZ3Vsb3BhdGh5IChwcm9sb25nZWQgUFQgb3IgUFRUOyBlbGV2YXRlZCBELWRpbWVyKQogICAgLSBBY3V0ZSBnYXN0cm9pbnRlc3RpbmFsIHN5bXB0b21zIChkaWFycmhlYSwgdm9taXRpbmcsIG9yIGFiZG9taW5hbCBwYWluKQo0LiBFbGV2YXRlZCBtYXJrZXJzIG9mIGluZmxhbW1hdGlvbiAoZWcsIEVTUiwgQ1JQLCBvciBwcm9jYWxjaXRvbmluKQo1LiBObyBvdGhlciBvYnZpb3VzIG1pY3JvYmlhbCBjYXVzZSBvZiBpbmZsYW1tYXRpb24sIGluY2x1ZGluZyBiYWN0ZXJpYWwgc2Vwc2lzIGFuZCBzdGFwaHlsb2NvY2NhbC9zdHJlcHRvY29jY2FsIHRveGljIHNob2NrIHN5bmRyb21lcwo2LiBFdmlkZW5jZSBvZiBTQVJTLUNvVi0yIGluZmVjdGlvbgogICAgLSBBbnkgb2YgdGhlIGZvbGxvd2luZzoKICAgIC0gUG9zaXRpdmUgU0FSUy1Db1YtMiBSVC1QQ1IKICAgIC0gUG9zaXRpdmUgc2Vyb2xvZ3kKICAgIC0gUG9zaXRpdmUgYW50aWdlbiB0ZXN0CiAgICAtIENvbnRhY3Qgd2l0aCBhbiBpbmRpdmlkdWFsIHdpdGggQ09WSUQtMTkKCmBgYHtyLCBmaWcuaGVpZ2h0PSAxMCwgZmlnLndpZHRoPSA4fQojcm93IDwtIGRmX3NpbmdsZWNhc2VzWzg3LCBdCldIT19mdWxmaWxsZWQgPC0gYXBwbHkoZGZfc2luZ2xlY2FzZXMsIDEsIGZ1bmN0aW9uKHJvdykgewogICAgcGF0X2lkIDwtIHJvd1sicGF0aWVudElEX2ludCJdCiAgICAKICAgICMgY3JpdGVyaWEgMQogICAgY3JpdGVyaWExID0gVFJVRQogICAgCiAgICAjIGNyaXRlcmlhIDI6IGZldmVyPwogICAgZmV2ZXIgPC0gcm93WyJzeW1wX2ZldmVyIl0gPT0gVFJVRSB8IHJvd1sia2F3YXNha2lfZmV2ZXIiXSA9PSBUUlVFCgogICAgY3JpdGVyaWEyIDwtIGFueShmZXZlcikKICAgIAogICAgIyBjcml0ZXJpYSAzOiBjbGluaWNhbCBzaWducyBvZiBtdWx0aXN5c3RlbSBpbnZvbHZlbWVudCAoYXQgbGVhc3QgMikKICAgICMjIFJhc2gsIGJpbGF0ZXJhbCBub25wdXJ1bGVudCBjb25qdW5jdGl2aXRpcywgb3IgbXVjb2N1dGFuZW91cyBpbmZsYW1tYXRpb24gc2lnbnMgKG9yYWwsIGhhbmRzLCBvciBmZWV0KQogICAgcmFzaCA8LSByb3dbImthd2FzYWtpX2V4YW50aGVtYSJdID09IFRSVUUKICAgIGNvbmp1bmN0aXZpdGlzIDwtIHJvd1sia2F3YXNha2lfY29uanVuY3Rpdml0aXMiXSA9PSBUUlVFCiAgICBtdWNvY3V0YW5lYW91cyA8LSByb3dbImthd2FzYWtpX21vdXRoIl0gPT0gVFJVRSB8IHJvd1sia2F3YXNha2lfZXh0cmVtaXR5Il0gPT0gVFJVRQogICAgCiAgICBjcml0ZXJpYTNfYSA8LSBhbnkocmFzaCwgY29uanVuY3Rpdml0aXMsIG11Y29jdXRhbmVhb3VzKQogICAgCiAgICAjIyBoeXBvdGVuc2lvbiBvciBzaG9jawogICAgc2hvY2sgPC0gcm93WyJzeW1wX2NhcmRpb3Zhc2Nfc2hvY2siXSA9PSBUUlVFCiAgICBjcml0ZXJpYTNfYiA8LSBhbnkoc2hvY2spCiAgICAKICAgICMjIGNhcmRpYWMgZHlzZnVuY3Rpb24KICAgIG15b2NhcmRpdGlzIDwtIHJvd1sic3ltcF9jYXJkaW92YXNjX215b2NhcmQiXSA9PSBUUlVFCiAgICBwZXJpY2FyZGl0aXMgPC0gcm93WyJzeW1wX2NhcmRpb3Zhc2NfcGVyaWNhcmQiXSA9PSBUUlVFCiAgICBMVkVGX3VuZGVyMzAgPC0gcm93WyJzeW1wX2NhcmRpb3Zhc2NfTFZfbGVzczMwIl0gPT0gVFJVRQogICAgTFZFRl8zMHRvNTUgPC0gcm93WyJzeW1wX2NhcmRpb3Zhc2NfTFZfMzB0bzU1Il0gPT0gVFJVRQogICAgQk5QIDwtIChhcy5udW1lcmljKHJvd1sibGFiX0JOUF9hZG1pcyJdKSA+IGNvX0JOUCB8IGFzLm51bWVyaWMocm93WyJsYWJfQk5QX21heCJdKSA+IGNvX0JOUCApIAogICAgTlRwcm9CTlAgPC0gYXMubnVtZXJpYyhyb3dbImxhYl9OVHByb0JOUCJdKSA+IGNvX05UcHJvQk5QCiAgICB0cm9wbyA8LSBhcy5udW1lcmljKHJvd1sibGFiX3Ryb3BvbmluX2FkbWlzIl0pID4gY29fdHJvcG8KICAgIGNvcm9uYXJ5IDwtIHJvd1sic3ltcF9jYXJkaW92YXNjX2NvcmRpbGF0Il0gPT0gVFJVRSB8IHJvd1sic3ltcF9jYXJkaW92YXNjX2FuZXVyeXNtIl0gPT0gVFJVRQogICAgCiAgICBjcml0ZXJpYTNfYyA8LSBhbnkobXlvY2FyZGl0aXMsIExWRUZfdW5kZXIzMCwgTFZFRl8zMHRvNTUsIE5UcHJvQk5QLCBCTlAsIHRyb3BvLCBjb3JvbmFyeSkKICAgIAogICAgIyMgY29hZ3Vsb3BhdGh5CiAgICBmaWJyaW5vZ2VuIDwtIGFzLm51bWVyaWMocm93WyJsYWJfZmlicmlubyJdKSA+IGNvX2ZpYnJpbm8KICAgIERkaW1lcnMgPC0gYXMubnVtZXJpYyhyb3dbImxhYl9EZGltX3BlYWsiXSkgPiBjb19EZGltIHwgIGFzLm51bWVyaWMocm93WyJsYWJfRGRpbV9OUyJdKSA+IGNvX0RkaW0KICAgIAogICAgY3JpdGVyaWEzX2QgPC0gYW55KGZpYnJpbm9nZW4sIERkaW1lcnMpCiAgICAKICAgICMjIGFjdXRlIEdJIHN5bXB0b21zCiAgICBHSXN5bXAgPC0gcm93WyJzeW1wX0dJX05TIl0gPT0gVFJVRSB8IHJvd1sic3ltcF9HSV9hYmRvcGFpbiJdID09IFRSVUUgfCByb3dbInN5bXBfR0lfdm9taXRpbmciXSA9PSBUUlVFIHwgcm93WyJzeW1wX0dJX2RpYXJyaCJdID09IFRSVUUgfCByb3dbInN5bXBfR0lfY29saXRpcyJdID09IFRSVUUgCiAgICAKICAgIGNyaXRlcmlhM19lIDwtIGFueShHSXN5bXApCiAgICAKICAgIGNyaXRlcmlhMyA8LSBzdW0oY3JpdGVyaWEzX2EsIGNyaXRlcmlhM19iLCBjcml0ZXJpYTNfYywgY3JpdGVyaWEzX2QsIGNyaXRlcmlhM19lLCBuYS5ybSA9IFRSVUUpID49IDIKICAgICAgCiAgICAjIGNyaXRlcmlhIDQ6IEVsZXZhdGVkIG1hcmtlcnMgb2YgaW5mbGFtbWF0aW9uIChlZywgRVNSLCBDUlAsIG9yIHByb2NhbGNpdG9uaW4pCiAgICBuZXV0cm9waGlsaWEgPC0gYXMubnVtZXJpYyhyb3dbImxhYl9uZXV0cm9waGlscyJdKSA+IGNvX25ldXRyb3BoaWxpYQogICAgZWxldmF0ZWRfQ1JQIDwtIChhcy5udW1lcmljKHJvd1sibGFiX0NSUF9hZG1pcyJdKSA+PSBjb19DUlApIHwgKGFzLm51bWVyaWMocm93WyJsYWJfQ1JQX05TIl0pID49IGNvX0NSUCkgfCAoYXMubnVtZXJpYyhyb3dbImxhYl9DUlBfcGVhayJdKSA+PSBjb19DUlAgKQogICMgIHByaW50KHBhc3RlMChwYXRfaWQsIGVsZXZhdGVkX0NSUCwgcm93WyJsYWJfQ1JQX3BlYWsiXSkpCiAgICBseW1waG9wZW5pYSA8LSBhcy5udW1lcmljKHJvd1sibGFiX2x5bXBob2N5dGVzX2xvd2VzdCJdKSA8IGNvX2x5bXBobwoKICAgIGZlcnJpdGluIDwtIChhcy5udW1lcmljKHJvd1sibGFiX2ZlcnJpdGluX05TIl0pID4gY29fZmVycml0aW4gfCBhcy5udW1lcmljKHJvd1sibGFiX2ZlcnJpdGluX2FkbWlzIl0pID4gY29fZmVycml0aW4gfCBhcy5udW1lcmljKHJvd1sibGFiX2ZlcnJpdGluX3BlYWsiXSkgPiBjb19mZXJyaXRpbikKICAgIGFsYnVtaW4gPC0gYXMubnVtZXJpYyhyb3dbImxhYl9hbGJ1bWluX2FkbWlzIl0pIDwgY29fYWxidSB8IGFzLm51bWVyaWMocm93WyJsYWJfYWxidW1pbl9sb3dlc3QiXSkgPCBjb19hbGJ1IHwgYXMubnVtZXJpYyhyb3dbImxhYl9hbGJ1bWluX05TIl0pIDwgY29fYWxidQogICAgUENUIDwtIGFzLm51bWVyaWMocm93WyJsYWJfUENUX2FkbWlzIl0pID4gY29fUENUIHwgYXMubnVtZXJpYyhyb3dbImxhYl9QQ1RfcGVhayJdKSA+IGNvX1BDVCB8IGFzLm51bWVyaWMocm93WyJsYWJfUENUX05TIl0pID4gY29fUENUIAogICAgTERIIDwtIGFzLm51bWVyaWMocm93WyJsYWJfTERIIl0pID4gY29fTERICiAgICBJTDYgPC0gYXMubnVtZXJpYyhyb3dbImxhYl9JTDYiXSkgPiBjb19JTDYKICAgIEVTUiA8LSBhcy5udW1lcmljKHJvd1sibGFiX0VTUiJdKSA+IGNvX0VTUgoKICAgIGNyaXRlcmlhNCA8LSBhbnkobmV1dHJvcGhpbGlhLCBlbGV2YXRlZF9DUlAsIGx5bXBob3BlbmlhLCBmZXJyaXRpbiwgYWxidW1pbiwgUENULCBMREgsIElMNiwgRVNSKQoKICAgICMgY3JpdGVyaWEgNTogTm8gb3RoZXIgb2J2aW91cyBtaWNyb2JpYWwgY2F1c2Ugb2YgaW5mbGFtbWF0aW9uCiAgICBjcml0ZXJpYTUgPC0gVFJVRQogICAgCiAgICAjIGNyaXRlcmlhIDY6IENPVklEIHBvcz8KICAgIFBDUl9wb3MgPC0gcm93WyJjb3ZpZF9QQ1JfcG9zIl0gPT0gVFJVRQogICAgc3Rvb2xfcG9zIDwtIHJvd1siY292aWRfUENSX3N0b29sX3BvcyJdID09IFRSVUUKICAgIGNsb3NlY29udGFjdCA8LSByb3dbImNvdmlkX2Nsb3NlY29udGFjdCJdID09IFRSVUUKICAgIElnQSA8LSByb3dbImNvdmlkX0lnQV9wb3MiXSA9PSBUUlVFCiAgICBJZ00gPC0gcm93WyJjb3ZpZF9JZ01fcG9zIl0gPT0gVFJVRSAgICAKICAgIElnRyA8LSByb3dbImNvdmlkX0lnR19wb3MiXSA9PSBUUlVFICAgIAogICAgYW55X3Nlcm8gPC0gcm93WyJjb3ZpZF9zZXJvX3BvcyJdID09IFRSVUUKICAgIAogICAgY3JpdGVyaWE2IDwtIGFueShQQ1JfcG9zLCBzdG9vbF9wb3MsIGNsb3NlY29udGFjdCwgSWdBLCBJZ00sIElnRywgYW55X3Nlcm8pCiAgICAKICAgIGlmIChOQSAlaW4lIGMoY3JpdGVyaWExLCBjcml0ZXJpYTIsIGNyaXRlcmlhMywgY3JpdGVyaWE0LCBjcml0ZXJpYTUsIGNyaXRlcmlhNikpewogICAgICBjcml0ZXJpYV9mdWxmaWxsZWQgPC0gTkEKICAgIH0gZWxzZSBpZiAoRkFMU0UgJWluJSBjKGNyaXRlcmlhMSwgY3JpdGVyaWEyLCBjcml0ZXJpYTMsIGNyaXRlcmlhNCwgY3JpdGVyaWE1LCBjcml0ZXJpYTYpKXsKICAgICAgY3JpdGVyaWFfZnVsZmlsbGVkIDwtIEZBTFNFCiAgICB9IGVsc2UgaWYgKHN1bShjcml0ZXJpYTEsIGNyaXRlcmlhMiwgY3JpdGVyaWEzLCBjcml0ZXJpYTQsIGNyaXRlcmlhNSwgY3JpdGVyaWE2LCBuYS5ybSA9IFRSVUUpID09IDYpewogICAgICBjcml0ZXJpYV9mdWxmaWxsZWQgPC0gVFJVRQogICAgfSBlbHNlIHsKICAgICAgY3JpdGVyaWFfZnVsZmlsbGVkIDwtIEZBTFNFCiAgICB9CgogICAgcmV0dXJuKGMocGF0X2lkLCAiY3JpdGVyaWExX2FnZSIgPSBjcml0ZXJpYTEsICJjcml0ZXJpYTJfZmV2ZXIiID0gY3JpdGVyaWEyLCAiY3JpdGVyaWEzX2NsaW5pY2FsIiA9IGNyaXRlcmlhMywgImNyaXRlcmlhNF9pbmZsYW1tIiA9IGNyaXRlcmlhNCwgImNyaXRlcmlhNV9ub0FsdCIgPSBjcml0ZXJpYTUsICJjcml0ZXJpYTZfcmVjZW50RXhwb3N1cmUiID0gY3JpdGVyaWE2LCAiY3JpdGVyaWFfZnVsZmlsbGVkIiA9IGNyaXRlcmlhX2Z1bGZpbGxlZCkpCn0pCgoKV0hPX2Z1bGZpbGxlZCA8LSBXSE9fZnVsZmlsbGVkICU+JSB0KCkgJT4lIGFzX3RpYmJsZSgpCldIT19mdWxmaWxsZWQgPC0gdHlwZV9jb252ZXJ0KFdIT19mdWxmaWxsZWQpCldIT19mdWxmaWxsZWRfaGVhdG1hcCA8LSBXSE9fZnVsZmlsbGVkCmNvbHMgPC0gc2FwcGx5KFdIT19mdWxmaWxsZWRfaGVhdG1hcCwgaXMubG9naWNhbCkKV0hPX2Z1bGZpbGxlZF9oZWF0bWFwWyxjb2xzXSA8LSBsYXBwbHkoV0hPX2Z1bGZpbGxlZF9oZWF0bWFwWyxjb2xzXSwgYXMubnVtZXJpYykKV0hPX2Z1bGZpbGxlZF9oZWF0bWFwX21lbHQgPC0gV0hPX2Z1bGZpbGxlZF9oZWF0bWFwICU+JSBtZWx0KCkKV0hPX2Z1bGZpbGxlZF9oZWF0bWFwX21lbHRbaXMubmEoV0hPX2Z1bGZpbGxlZF9oZWF0bWFwX21lbHQpXSA8LSAyCgpza2ltKFdIT19mdWxmaWxsZWQpCgojZ2dwbG90KFdIT19mdWxmaWxsZWRfaGVhdG1hcF9tZWx0LCBhZXMoeCA9IHZhcmlhYmxlLCB5ID0gYXMuY2hhcmFjdGVyKHBhdGllbnRJRF9pbnQpLCBmaWxsID0gYXMuZmFjdG9yKHZhbHVlKSkpICsgZ2VvbV90aWxlKCkgKyB0aGVtZV9jbGFzc2ljKCkgKyB0aGVtZShheGlzLmxpbmU9ZWxlbWVudF9ibGFuaygpKSArIGxhYnMoeSA9ICJQYXRpZW50IElEIiwgeCA9ICJjcml0ZXJpYSIsIGZpbGwgPSAiY3JpdGVyaWEgbWV0IiwgdGl0bGUgPSAiT3ZlcnZpZXcgb2Ygd2hpY2ggc2luZ2xlIGNhc2VzIGZ1bGZpbGwgV0hPIE1JUy1DIGNhc2UgZGVmaW5pdGlvbiIpICsgIHNjYWxlX2ZpbGxfbWFudWFsKGxhYmVscyA9IGMoIk5vIiwgIlllcyIsICJNaXNzaW5nIiksIHZhbHVlcyA9IGMoInBpbmsyIiwgInJveWFsYmx1ZTMiLCAiZGFya2dyZXkiKSkgKyB0aGVtZShheGlzLnRleHQueD1lbGVtZW50X3RleHQoYW5nbGU9OTAsIGhqdXN0PTEpKQpgYGAKCiMjIFBlci1jYXNlIG92ZXJ2aWV3CmBgYHtyLCBmaWcuaGVpZ2h0ID0gMTAsIGZpZy53aWR0aD03fQpQSU1TX1RTX2Z1bGZpbGxlZF9oZWF0bWFwX21lbHQkY3JpdGVyaWEgPC0gIlBJTVMtVFMiCldIT19mdWxmaWxsZWRfaGVhdG1hcF9tZWx0JGNyaXRlcmlhIDwtICJXSE8iCkNEQ19mdWxmaWxsZWRfaGVhdG1hcF9tZWx0JGNyaXRlcmlhIDwtICJDREMiCgpmdWxsX2hlYXRtYXAgPC0gcmJpbmQoUElNU19UU19mdWxmaWxsZWRfaGVhdG1hcF9tZWx0LCBXSE9fZnVsZmlsbGVkX2hlYXRtYXBfbWVsdCwgQ0RDX2Z1bGZpbGxlZF9oZWF0bWFwX21lbHQpCgpnZ3Bsb3QoZnVsbF9oZWF0bWFwLCBhZXMoeCA9IHZhcmlhYmxlLCB5ID0gYXMuY2hhcmFjdGVyKHBhdGllbnRJRF9pbnQpLCBmaWxsID0gYXMuZmFjdG9yKHZhbHVlKSkpICsgZ2VvbV90aWxlKCkgKyB0aGVtZV9jbGFzc2ljKCkgKyB0aGVtZShheGlzLmxpbmU9ZWxlbWVudF9ibGFuaygpKSArIGxhYnMoeSA9ICJQYXRpZW50IElEIiwgeCA9ICJjcml0ZXJpYSIsIGZpbGwgPSAiY3JpdGVyaWEgbWV0IiwgdGl0bGUgPSAiT3ZlcnZpZXcgb2Ygd2hpY2ggc2luZ2xlIGNhc2VzIGZ1bGZpbGwgY2FzZSBkZWZpbml0aW9ucyIpICsgIHNjYWxlX2ZpbGxfbWFudWFsKGxhYmVscyA9IGMoIk5vIiwgIlllcyIsICJNaXNzaW5nIiksIHZhbHVlcyA9IHdlc19wYWxldHRlKCJaaXNzb3UxIikpICsgdGhlbWUoYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KGFuZ2xlPTkwLCBoanVzdD0xKSkgKyBmYWNldF93cmFwKH4gY3JpdGVyaWEsIHNjYWxlcyA9ICJmcmVlX3giKQoKCmBgYAoKCiMjIFN1bW1hcnkKYGBge3J9CmNyaXRlcmlhX3N1bW1hcnkgPC0gZGF0YS5mcmFtZShQSU1TX1RTX2Z1bGZpbGxlZCAlPiUgc2VsZWN0KGNyaXRlcmlhX2Z1bGZpbGxlZCksIENEQ19mdWxmaWxsZWQgJT4lIHNlbGVjdChjcml0ZXJpYV9mdWxmaWxsZWQpLCBXSE9fZnVsZmlsbGVkICU+JSBzZWxlY3QoY3JpdGVyaWFfZnVsZmlsbGVkKSkKY29sbmFtZXMoY3JpdGVyaWFfc3VtbWFyeSkgPC0gYygiUElNUy1UUyIsICJDREMiLCAiV0hPIikKCmNvbHMgPC0gc2FwcGx5KGNyaXRlcmlhX3N1bW1hcnksIGlzLmxvZ2ljYWwpCmNyaXRlcmlhX3N1bW1hcnlbLGNvbHNdIDwtIGxhcHBseShjcml0ZXJpYV9zdW1tYXJ5Wyxjb2xzXSwgYXMubnVtZXJpYykKCmNyaXRlcmlhX3N1bW1hcnkgPC0gY3JpdGVyaWFfc3VtbWFyeSAlPiUgbWVsdCgpICU+JSAKICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cF9ieSh2YXJpYWJsZSkgJT4lIAogICAgICAgICAgICAgICAgICAgICAgICAgIHN1bW1hcmlzZShmdWxmaWxsZWQgPSBzdW0odmFsdWUgPT0gMSwgbmEucm0gPSBUUlVFKSwgbm90X2Z1bGZpbGxlZCA9IHN1bSh2YWx1ZSA9PSAwLCBuYS5ybSA9IFRSVUUpLCBub3RfZXZhbHVhYmxlID0gc3VtKGlzLm5hKHZhbHVlKSkpCmNyaXRlcmlhX3N1bW1hcnkkc3VtIDwtIHJvd1N1bXMoY3JpdGVyaWFfc3VtbWFyeVssLTFdKQoKY3JpdGVyaWFfc3VtbWFyeV9tZWx0IDwtIGNyaXRlcmlhX3N1bW1hcnkgJT4lIG1lbHQoKQpjb2xuYW1lcyhjcml0ZXJpYV9zdW1tYXJ5X21lbHQpIDwtIGMoImNlbnRlciIsICJmdWxmaWxsZWQiLCAiY291bnQiKQoKZmlsbF9iYXIgPC0gZ2dwbG90KGNyaXRlcmlhX3N1bW1hcnlfbWVsdCAlPiUgZmlsdGVyKGZ1bGZpbGxlZCAhPSAnc3VtJyksIGFlcyh4ID0gY2VudGVyLCB5ID0gY291bnQsIGZpbGwgPSBmdWxmaWxsZWQpKSArIAogICAgICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiZmlsbCIpICsgdGhlbWVfYncoKSArIAogICAgICBsYWJzKHkgPSAicmF0aW8iLCB0aXRsZSA9ICJTaW5nbGUgY2FzZXMgbWVldGluZyB3aGljaCBjcml0ZXJpYSIsIHN1YnRpdGxlID0gcGFzdGUwKCJwZXJjZW50IG9mIHRvdGFsIChuID0gIiwgbWF4KGNyaXRlcmlhX3N1bW1hcnlfbWVsdCRjb3VudCkgLCIpIikpICsKICAgICAgICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSB3ZXNfcGFsZXR0ZSgiUm95YWwxIilbYygxLDIsNCldKQoKZG9kZ2VfYmFyIDwtIGdncGxvdChjcml0ZXJpYV9zdW1tYXJ5X21lbHQgJT4lIGZpbHRlcihmdWxmaWxsZWQgIT0gJ3N1bScpLCBhZXMoeCA9IGNlbnRlciwgeSA9IGNvdW50LCBmaWxsID0gZnVsZmlsbGVkKSkgKyAKICAgICAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gImRvZGdlIikgKyB0aGVtZV9idygpICsgCiAgICAgIGxhYnMoeSA9ICJuIiwgdGl0bGUgPSAiU2luZ2xlIGNhc2VzIG1lZXRpbmcgd2hpY2ggY3JpdGVyaWEiLCBzdWJ0aXRsZSA9ICJhYnNvbHV0ZSB2YWx1ZXMiKSArCiAgICAgICAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gd2VzX3BhbGV0dGUoIlJveWFsMSIpW2MoMSwyLDQpXSkKCmdnYXJyYW5nZShkb2RnZV9iYXIsIGZpbGxfYmFyLCBsZWdlbmQgPSAiYm90dG9tIiwgY29tbW9uLmxlZ2VuZCA9IFRSVUUpCmBgYAoKIyBBc3NvY2lhdGlvbiBvZiBjYXNlIGRlZmluaXRpb24gd2l0aCBvdXRjb21lCmBgYHtyfQpXSE9fb3V0Y29tZSA8LSBXSE9fZnVsZmlsbGVkX2hlYXRtYXAgJT4lIHNlbGVjdChjb250YWlucygicGF0aWVudElEX2ludCIpIHwgY29udGFpbnMoImNyaXRlcmlhX2Z1bGZpbGxlZCIpKQpjb2xuYW1lcyhXSE9fb3V0Y29tZSkgPC0gYygicGF0aWVudElEX2ludCIsICJjYXNlZGVmX1dIT19mdWxmaWxsZWQiKQoKQ0RDX291dGNvbWUgPC0gQ0RDX2Z1bGZpbGxlZF9oZWF0bWFwICU+JSBzZWxlY3QoY29udGFpbnMoInBhdGllbnRJRF9pbnQiKSB8IGNvbnRhaW5zKCJjcml0ZXJpYV9mdWxmaWxsZWQiKSkKY29sbmFtZXMoQ0RDX291dGNvbWUpIDwtIGMoInBhdGllbnRJRF9pbnQiLCAiY2FzZWRlZl9DRENfZnVsZmlsbGVkIikKClBJTVNfVFNfb3V0Y29tZSA8LSBQSU1TX1RTX2Z1bGZpbGxlZF9oZWF0bWFwICU+JSBzZWxlY3QoY29udGFpbnMoInBhdGllbnRJRF9pbnQiKSB8IGNvbnRhaW5zKCJjcml0ZXJpYV9mdWxmaWxsZWQiKSkKY29sbmFtZXMoUElNU19UU19vdXRjb21lKSA8LSBjKCJwYXRpZW50SURfaW50IiwgImNhc2VkZWZfUElNU19UU19mdWxmaWxsZWQiKQoKYXNzb2Nfb3V0Y29tZSA8LSBtZXJnZShXSE9fb3V0Y29tZSwgQ0RDX291dGNvbWUsIGJ5ID0gInBhdGllbnRJRF9pbnQiKQphc3NvY19vdXRjb21lIDwtIG1lcmdlKGFzc29jX291dGNvbWUsIFBJTVNfVFNfb3V0Y29tZSkKI2Fzc29jX291dGNvbWUgPC0gYXNzb2Nfb3V0Y29tZVtjb21wbGV0ZS5jYXNlcyhhc3NvY19vdXRjb21lWyAsLTFdKSxdCgpvdXRjb21lX3BhcmFtcyA8LSBkZl9zaW5nbGVjYXNlcyAlPiUgc2VsZWN0KHBhdGllbnRJRF9pbnQgfCBzeW1wX2NhcmRpb3Zhc2NfY29yZGlsYXQgfCBzeW1wX2NhcmRpb3Zhc2NfYW5ldXJ5c20gfCBzeW1wX2NhcmRpb3Zhc2Nfc2hvY2sgfCBvdXRjb21lX2RlYXRoIHwgY3JpdGNhcmVfTVYgfCBjcml0Y2FyZV9FQ01PKQoKYXNzb2Nfb3V0Y29tZV9mdWxsIDwtIG1lcmdlKG91dGNvbWVfcGFyYW1zLCBhc3NvY19vdXRjb21lLCBieSA9ICJwYXRpZW50SURfaW50IiwgYWxsID0gVFJVRSkKCmNvbHMgPC0gc2FwcGx5KGFzc29jX291dGNvbWVfZnVsbCwgaXMubG9naWNhbCkKYXNzb2Nfb3V0Y29tZV9mdWxsWyxjb2xzXSA8LSBsYXBwbHkoYXNzb2Nfb3V0Y29tZV9mdWxsWyxjb2xzXSwgYXMubnVtZXJpYykKCm1ha2VVcHNldFIoYXNzb2Nfb3V0Y29tZV9mdWxsICU+JSBzZWxlY3QoLWNvbnRhaW5zKCJwYXRpZW50SUQiKSkpCmBgYAoKQSBuZXcgdmFyaWFibGUgJ3VuZmF2b3VyYWJsZSBjb3Vyc2UnIG1hZGUsIHdoaWNoIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmc6CgotIHN5bXBfY2FyZGlvdmFzY19jb3JkaWxhdCAKLSBzeW1wX2NhcmRpb3Zhc2NfYW5ldXJ5c20KLSBzeW1wX2NhcmRpb3Zhc2Nfc2hvY2sgCi0gb3V0Y29tZV9kZWF0aAotIGNyaXRjYXJlX01WIAotIGNyaXRjYXJlX0VDTU8KLSBjcml0Y2FyZV9SUlQKLSBjcml0Y2FyZV9pbm90cm9wCi0gYWRtaXNfUElDVV9hZG1pcwoKTWlsZCBwcmVzZW50YXRpb24gbWVhbnMgYWxsIG9mIHRoZSBhYm92ZSBhcmUgZWl0aGVyIDAgb3IgTkEuIAoKYGBge3J9CmFzc29jX291dGNvbWUgPC0gbWVyZ2UoV0hPX291dGNvbWUsIENEQ19vdXRjb21lLCBieSA9ICJwYXRpZW50SURfaW50IikKYXNzb2Nfb3V0Y29tZSA8LSBtZXJnZShhc3NvY19vdXRjb21lLCBQSU1TX1RTX291dGNvbWUpCiNhc3NvY19vdXRjb21lIDwtICNhc3NvY19vdXRjb21lW2NvbXBsZXRlLmNhc2VzKGFzc29jX291dGNvbWVbICwtMV0pLF0KCm91dGNvbWVfcGFyYW1zIDwtIGRmX3NpbmdsZWNhc2VzICU+JSBzZWxlY3QocGF0aWVudElEX2ludCB8IGNvbnRhaW5zKCJjcml0Y2FyZSIpICB8IGNvbnRhaW5zKCJhZG1pc19QSUNVX2FkbWlzIikgfCBjb250YWlucygib3V0Y29tZV9kZWF0aCIpICB8Y29udGFpbnMgKCJzeW1wX2NhcmRpb3Zhc2NfY29yZGlsYXQiKSB8IGNvbnRhaW5zICgic3ltcF9jYXJkaW92YXNjX2FuZXVyeXNtIikgIHxjb250YWlucygic3ltcF9jYXJkaW92YXNjX3Nob2NrIikpCgphc3NvY19vdXRjb21lX2Z1bGwgPC0gbWVyZ2Uob3V0Y29tZV9wYXJhbXMsIGFzc29jX291dGNvbWUsIGJ5ID0gInBhdGllbnRJRF9pbnQiKQoKY29scyA8LSBzYXBwbHkoYXNzb2Nfb3V0Y29tZV9mdWxsLCBpcy5sb2dpY2FsKQphc3NvY19vdXRjb21lX2Z1bGxbLGNvbHNdIDwtIGxhcHBseShhc3NvY19vdXRjb21lX2Z1bGxbLGNvbHNdLCBhcy5udW1lcmljKQoKYXNzb2Nfb3V0Y29tZV9mdWxsJHVuZmF2b3VyYWJsZV9jb3Vyc2UgPC0gaWZlbHNlKGFzc29jX291dGNvbWVfZnVsbCRzeW1wX2NhcmRpb3Zhc2NfY29yZGlsYXQgPT0gMSB8IGFzc29jX291dGNvbWVfZnVsbCRzeW1wX2NhcmRpb3Zhc2NfYW5ldXJ5c20gPT0gMSB8IGFzc29jX291dGNvbWVfZnVsbCRzeW1wX2NhcmRpb3Zhc2Nfc2hvY2sgPT0gMSB8IGFzc29jX291dGNvbWVfZnVsbCRvdXRjb21lX2RlYXRoID09IDEgfCBhc3NvY19vdXRjb21lX2Z1bGwkY3JpdGNhcmVfTVYgPT0gMSB8IGFzc29jX291dGNvbWVfZnVsbCRjcml0Y2FyZV9FQ01PID09IDEgfCBhc3NvY19vdXRjb21lX2Z1bGwkY3JpdGNhcmVfUlJUID09IDEgfCBhc3NvY19vdXRjb21lX2Z1bGwkYWRtaXNfUElDVV9hZG1pcyA9PSAxIHwgYXNzb2Nfb3V0Y29tZV9mdWxsJGNyaXRjYXJlX2lub3Ryb3AgPT0gMSAsIDEsIDApCgphc3NvY19vdXRjb21lX2Z1bGwkbWlsZF9wcmVzZW50YXRpb24gPC0gaWZlbHNlKChhc3NvY19vdXRjb21lX2Z1bGwkdW5mYXZvdXJhYmxlX2NvdXJzZSA9PSAwIHwgaXMubmEoYXNzb2Nfb3V0Y29tZV9mdWxsJHVuZmF2b3VyYWJsZV9jb3Vyc2UpKSwgMSwgMCkKCm1ha2VVcHNldFIoYXNzb2Nfb3V0Y29tZV9mdWxsICU+JSBzZWxlY3QoY29udGFpbnMoImNhc2VkZWYiKSB8IGNvbnRhaW5zKCJ1bmZhdm91cmFibGVfY291cnNlIikgKSkKCgptYWtlVXBzZXRSKGFzc29jX291dGNvbWVfZnVsbCAlPiUgc2VsZWN0KGNvbnRhaW5zKCJjYXNlZGVmIikgfCBjb250YWlucygidW5mYXZvdXJhYmxlX2NvdXJzZSIpICB8IGNvbnRhaW5zKCJtaWxkX3ByZXMiKSApKQoKYGBgCgpBIG5ldyB2YXJpYWJsZSAnUElDVSBjYW5kaWRhdGUnIG1hZGUsIHdoaWNoIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmc6CgotIHN5bXBfY2FyZGlvdmFzY19zaG9jayAKLSBvdXRjb21lX2RlYXRoCi0gY3JpdGNhcmVfTVYgCi0gY3JpdGNhcmVfRUNNTwotIGNyaXRjYXJlX1JSVAotIGNyaXRjYXJlX2lub3Ryb3AKLSBhZG1pc19QSUNVX2FkbWlzCgpNaWxkIHByZXNlbnRhdGlvbiBtZWFucyBhbGwgb2YgdGhlIGFib3ZlIGFyZSBlaXRoZXIgMCBvciBOQS4gCgpgYGB7cn0KYXNzb2Nfb3V0Y29tZSA8LSBtZXJnZShXSE9fb3V0Y29tZSwgQ0RDX291dGNvbWUsIGJ5ID0gInBhdGllbnRJRF9pbnQiKQphc3NvY19vdXRjb21lIDwtIG1lcmdlKGFzc29jX291dGNvbWUsIFBJTVNfVFNfb3V0Y29tZSkKI2Fzc29jX291dGNvbWUgPC0gYXNzb2Nfb3V0Y29tZVtjb21wbGV0ZS5jYXNlcyhhc3NvY19vdXRjb21lWyAsLTFdKSxdCgpvdXRjb21lX3BhcmFtcyA8LSBkZl9zaW5nbGVjYXNlcyAlPiUgc2VsZWN0KHBhdGllbnRJRF9pbnQgfCBjb250YWlucygiY3JpdGNhcmUiKSAgfCBjb250YWlucygiYWRtaXNfUElDVV9hZG1pcyIpIHwgY29udGFpbnMoIm91dGNvbWVfZGVhdGgiKSAgfGNvbnRhaW5zICgic3ltcF9jYXJkaW92YXNjX2NvcmRpbGF0IikgfCBjb250YWlucyAoInN5bXBfY2FyZGlvdmFzY19hbmV1cnlzbSIpICB8Y29udGFpbnMoInN5bXBfY2FyZGlvdmFzY19zaG9jayIpKQoKYXNzb2Nfb3V0Y29tZV9mdWxsIDwtIG1lcmdlKG91dGNvbWVfcGFyYW1zLCBhc3NvY19vdXRjb21lLCBieSA9ICJwYXRpZW50SURfaW50IikKCmNvbHMgPC0gc2FwcGx5KGFzc29jX291dGNvbWVfZnVsbCwgaXMubG9naWNhbCkKYXNzb2Nfb3V0Y29tZV9mdWxsWyxjb2xzXSA8LSBsYXBwbHkoYXNzb2Nfb3V0Y29tZV9mdWxsWyxjb2xzXSwgYXMubnVtZXJpYykKCmFzc29jX291dGNvbWVfZnVsbCRQSUNVX2NhbmRpZGF0ZSA8LSBpZmVsc2UoIGFzc29jX291dGNvbWVfZnVsbCRzeW1wX2NhcmRpb3Zhc2Nfc2hvY2sgPT0gMSB8IGFzc29jX291dGNvbWVfZnVsbCRvdXRjb21lX2RlYXRoID09IDEgfCBhc3NvY19vdXRjb21lX2Z1bGwkY3JpdGNhcmVfTVYgPT0gMSB8IGFzc29jX291dGNvbWVfZnVsbCRjcml0Y2FyZV9FQ01PID09IDEgfCBhc3NvY19vdXRjb21lX2Z1bGwkY3JpdGNhcmVfUlJUID09IDEgfCBhc3NvY19vdXRjb21lX2Z1bGwkYWRtaXNfUElDVV9hZG1pcyA9PSAxIHwgYXNzb2Nfb3V0Y29tZV9mdWxsJGNyaXRjYXJlX2lub3Ryb3AgPT0gMSAsIDEsIDApCgphc3NvY19vdXRjb21lX2Z1bGwkbWlsZF9wcmVzZW50YXRpb24gPC0gaWZlbHNlKChhc3NvY19vdXRjb21lX2Z1bGwkUElDVV9jYW5kaWRhdGUgPT0gMCB8IGlzLm5hKGFzc29jX291dGNvbWVfZnVsbCRQSUNVX2NhbmRpZGF0ZSkpLCAxLCAwKQoKbWFrZVVwc2V0Uihhc3NvY19vdXRjb21lX2Z1bGwgJT4lIHNlbGVjdChjb250YWlucygiY2FzZWRlZiIpIHwgY29udGFpbnMoIlBJQ1VfY2FuZGlkYXRlIikgKSkKCgptYWtlVXBzZXRSKGFzc29jX291dGNvbWVfZnVsbCAlPiUgc2VsZWN0KGNvbnRhaW5zKCJjYXNlZGVmIikgfCBjb250YWlucygiUElDVV9jYW5kaWRhdGUiKSAgfCBjb250YWlucygibWlsZF9wcmVzIikgKSkKCmBgYAoKCiMgRmluYWwgZmlndXJlcwoKIyMgU2V4CmBgYHtyfQp2YXJfY29ob3J0IDwtIGRmX2NvaG9ydCAlPiUgc2VsZWN0KGNvbnRhaW5zKCJzZXgiKSB8ICgiY29ob3J0X2lkIikgfCAidG90X2Nhc2VzX24iKQp2YXJfY29ob3J0JGNvaG9ydF9pZCA8LSBwYXN0ZTAodmFyX2NvaG9ydCRjb2hvcnRfaWQsICIgKG4gPSAiLCB2YXJfY29ob3J0JHRvdF9jYXNlc19uLCIpIikKc2V4X2YgPC0gdmFyX2NvaG9ydCAlPiUgZ3JvdXBfYnkoY29ob3J0X2lkKSAlPiUgc3VtbWFyaXplKHByY3QgPSBzZXhfZi90b3RfY2FzZXNfbikgJT4lICBtdXRhdGUoc2V4ID0gImZlbWFsZSIpCnNleF9tIDwtIHZhcl9jb2hvcnQgJT4lIGdyb3VwX2J5KGNvaG9ydF9pZCkgJT4lIHN1bW1hcml6ZShwcmN0ID0gc2V4X20vdG90X2Nhc2VzX24pICU+JSBtdXRhdGUoc2V4ID0gIm1hbGUiKQpzZXhfYWxsIDwtIHJiaW5kKHNleF9mLCBzZXhfbSkKCnBfc2V4X2NvaG9ydCA8LSBnZ3Bsb3Qoc2V4X2FsbCwgYWVzKHkgPSBjb2hvcnRfaWQsIHggPSBwcmN0LCBmaWxsID0gc2V4KSkgKyAKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiZmlsbCIpICsgCiAgdGhlbWVfYncoKSArIGxhYnMoeCA9ICIiKSArICBsYWJzKHkgPSAiIikgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IHdlc19wYWxldHRlKCJSb3lhbDEiKSkgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIiwgbGVnZW5kLnRpdGxlPWVsZW1lbnRfYmxhbmsoKSkrCiAgcnJlbW92ZSgieS50ZXh0IikgCgp2YXJfY29udHJvbHMgPC0gZGZfY29ob3J0X2NvbnRyb2xzICU+JSBmaWx0ZXIoY29ob3J0X3R5cGUgPT0gImNvbnRyb2wiKSAlPiUgc2VsZWN0KGNvbnRhaW5zKCJzZXgiKSB8ICgiY29ob3J0X2lkIikgfCAidG90X2Nhc2VzX24iKQp2YXJfY29udHJvbHMkY29ob3J0X2lkIDwtIHBhc3RlMCh2YXJfY29udHJvbHMkY29ob3J0X2lkLCAiIChuID0gIiwgdmFyX2NvbnRyb2xzJHRvdF9jYXNlc19uLCIpIikKc2V4X2YgPC0gdmFyX2NvbnRyb2xzICU+JSBncm91cF9ieShjb2hvcnRfaWQpICU+JSBzdW1tYXJpemUocHJjdCA9IHNleF9mL3RvdF9jYXNlc19uKSAlPiUgbXV0YXRlKHNleCA9ICJmZW1hbGUiKQpzZXhfbSA8LSB2YXJfY29udHJvbHMgJT4lIGdyb3VwX2J5KGNvaG9ydF9pZCkgJT4lIHN1bW1hcml6ZShwcmN0ID0gc2V4X20vdG90X2Nhc2VzX24pICU+JSBtdXRhdGUoc2V4ID0gIm1hbGUiKQpzZXhfYWxsIDwtIHJiaW5kKHNleF9mLCBzZXhfbSkKCnBfc2V4X2NvbnRyb2xzIDwtIGdncGxvdChzZXhfYWxsLCBhZXMoeSA9IGNvaG9ydF9pZCwgeCA9IHByY3QsIGZpbGwgPSBzZXgpKSArIAogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJmaWxsIikgKyAKICB0aGVtZV9idygpICsgbGFicyh4ID0gIiIpICsgCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gd2VzX3BhbGV0dGUoIlJveWFsMSIpKSsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICArIGxhYnMoeSA9ICIiKSsKICBycmVtb3ZlKCJ5LnRleHQiKSAKCm5fc2luZ2xlIDwtIGRmX3NpbmdsZWNhc2VzICU+JSBucm93KCkKdmFyX3NpbmdsZSA8LSBkZl9zaW5nbGVjYXNlcyAlPiUgc2VsZWN0KGNvbnRhaW5zKCJzZXgiKSkKdmFyX3NpbmdsZSRzZXhfbSA8LSBpZmVsc2UodmFyX3NpbmdsZSRzZXggPT0gIk0iLCBUUlVFLCBGQUxTRSkKdmFyX3NpbmdsZSRzZXhfZiA8LSBpZmVsc2UodmFyX3NpbmdsZSRzZXggPT0gIkYiLCBUUlVFLCBGQUxTRSkKY29scyA8LSBzYXBwbHkodmFyX3NpbmdsZSwgaXMubG9naWNhbCkKdmFyX3NpbmdsZVssY29sc10gPC0gbGFwcGx5KHZhcl9zaW5nbGVbLGNvbHNdLCBhcy5udW1lcmljKQp2YXJfc2luZ2xlIDwtIGNvbFN1bXModmFyX3NpbmdsZSAlPiUgc2VsZWN0KC1zZXgpLCBuYS5ybSA9IFRSVUUpCnZhcl9zaW5nbGUgPC0gdmFyX3NpbmdsZS9ucm93KGRmX3NpbmdsZWNhc2VzKSoxMDAKCnNleF9zaW5nbGUgPC0gZGF0YS5mcmFtZShjb2hvcnRfaWQgPSBwYXN0ZTAoInNpbmdsZSBjYXNlcyAobiA9ICIsIG5fc2luZ2xlX2Nhc2VzLCAiKSIpLCBwcmN0ID0gYyh2YXJfc2luZ2xlWyJzZXhfbSJdLCB2YXJfc2luZ2xlWyJzZXhfZiJdKSwgc2V4ID0gYygibWFsZSIsICJmZW1hbGUiKSkKCnBfc2V4X3NpbmdsZSA8LSBnZ3Bsb3Qoc2V4X3NpbmdsZSwgYWVzKHkgPSBjb2hvcnRfaWQsIHggPSBwcmN0LCBmaWxsID0gc2V4KSkgKyAKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiZmlsbCIpICsgCiAgdGhlbWVfYncoKSArIAogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IHdlc19wYWxldHRlKCJSb3lhbDEiKSkrCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArIGxhYnMoeSA9ICIiLCB4ID0gIkZyYWN0aW9uIikrIHJyZW1vdmUoInkudGV4dCIpIAoKcGxvdF9zZXggPC0gcGxvdF9ncmlkKHBfc2V4X2NvaG9ydCwgcF9zZXhfY29udHJvbHMsIHBfc2V4X3NpbmdsZSwgYWxpZ24gPSAidiIsIG5yb3cgPSAzLCByZWxfaGVpZ2h0cyA9IGMoMi8zLCAxLzUsIDEvMykpCnBsb3Rfc2V4CmBgYAoKIyMgQWdlIGRpc3RyaWJ1dGlvbgoKYGBge3J9CmNvaG9ydF9hZ2UgPC0gZGZfY29ob3J0X2NvbnRyb2xzICU+JSBzZWxlY3QoY29udGFpbnMoImNvaG9ydF9pZCIpIHwgY29udGFpbnMoImFnZSIpIHwgY29udGFpbnMoImNvaG9ydF90eXBlIikgIHwgY29udGFpbnMoInRvdF9jYXNlc19uIikpCmNvaG9ydF9hZ2UkY29ob3J0X2lkIDwtIHBhc3RlMChjb2hvcnRfYWdlJGNvaG9ydF9pZCwgIiAobiA9ICIsIGNvaG9ydF9hZ2UkdG90X2Nhc2VzX24sIikiKQpjb2hvcnRfYWdlJGFnZV9tZWRfeXJzIDwtIGFzLm51bWVyaWMoY29ob3J0X2FnZSRhZ2VfbWVkX3lycyApCmNvaG9ydF9hZ2UkYWdlX1ExX3lycyA8LSBhcy5udW1lcmljKGNvaG9ydF9hZ2UkYWdlX1ExX3lycykKY29ob3J0X2FnZSRhZ2VfUTNfeXJzIDwtIGFzLm51bWVyaWMoY29ob3J0X2FnZSRhZ2VfUTNfeXJzKQpjb2hvcnRfYWdlJGFnZV9taW5feXJzIDwtIGFzLm51bWVyaWMoY29ob3J0X2FnZSRhZ2VfbWluX3lycykKY29ob3J0X2FnZSRhZ2VfbWF4X3lycyA8LSBhcy5udW1lcmljKGNvaG9ydF9hZ2UkYWdlX21heF95cnMpCgpjb2hvcnRfYWdlJGRhdGFfZGVzY3IgPC0gaWZlbHNlKCFpcy5uYShjb2hvcnRfYWdlJGFnZV9RMV95cnMpICYgaXMubmEoY29ob3J0X2FnZSRhZ2VfbWluX3lycykgLCAiSVFSIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGlzLm5hKGNvaG9ydF9hZ2UkYWdlX1ExX3lycykgJiAhaXMubmEoY29ob3J0X2FnZSRhZ2VfbWluX3lycyksICJyYW5nZSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoIWlzLm5hKGNvaG9ydF9hZ2UkYWdlX1ExX3lycykgJiAhaXMubmEoY29ob3J0X2FnZSRhZ2VfbWluX3lycyksICJJUVIgKyByYW5nZSIsICJub25lIikpKQoKcF9hZ2VfY29ob3J0IDwtIGdncGxvdChjb2hvcnRfYWdlICU+JSBmaWx0ZXIoY29ob3J0X3R5cGUgPT0gImNvdmlkIiksIGFlcyh5ID0gY29ob3J0X2lkLCB4ID0gYWdlX21lZF95cnMsIGNvbCA9IGRhdGFfZGVzY3IpKSArIAogIGdlb21fcG9pbnQoc2l6ZSA9IDQpICsgCiAgZ2VvbV9lcnJvcmJhcihhZXMoeG1pbj1hZ2VfUTFfeXJzLCB4bWF4PWFnZV9RM195cnMpLCB3aWR0aD0uOCwgcG9zaXRpb249cG9zaXRpb25fZG9kZ2UoLjkpKSArCiAgZ2VvbV9lcnJvcmJhcihhZXMoeG1pbj1hZ2VfbWluX3lycywgIHhtYXg9YWdlX21heF95cnMpLCB3aWR0aD0uMiwgcG9zaXRpb249cG9zaXRpb25fZG9kZ2UoLjkpKSArCiAgdGhlbWVfYncoKSArIGxpbXMoeCA9IGMoMCwyMSkpICsgCiAgbGFicyh5ID0gIiIsIHggPSAiIiwgY29sID0gImJhcnMiKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0idG9wIiwgbGVnZW5kLnRpdGxlPWVsZW1lbnRfYmxhbmsoKSkrCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMod2VzX3BhbGV0dGUoIkJvdHRsZVJvY2tldDIiKVsxOjNdLCB3ZXNfcGFsZXR0ZSgiQm90dGxlUm9ja2V0MSIpWzJdKSkKCnBfYWdlX2NvbnRyb2xzIDwtIGdncGxvdChjb2hvcnRfYWdlICU+JSBmaWx0ZXIoY29ob3J0X3R5cGUgIT0gImNvdmlkIiksIGFlcyh5ID0gY29ob3J0X2lkLCB4ID0gYWdlX21lZF95cnMsIGNvbCA9IGRhdGFfZGVzY3IpKSArIAogIGdlb21fcG9pbnQoc2l6ZSA9IDQpICsgCiAgZ2VvbV9lcnJvcmJhcihhZXMoeG1pbj1hZ2VfUTFfeXJzLCB4bWF4PWFnZV9RM195cnMpLCB3aWR0aD0uMiwgcG9zaXRpb249cG9zaXRpb25fZG9kZ2UoLjkpKSArCiAgZ2VvbV9lcnJvcmJhcihhZXMoeG1pbj1hZ2VfbWluX3lycywgIHhtYXg9YWdlX21heF95cnMpLCB3aWR0aD0uMiwgcG9zaXRpb249cG9zaXRpb25fZG9kZ2UoLjkpKSArCiAgdGhlbWVfYncoKSArIGxpbXMoeCA9IGMoMCwyMSkpICsKICBsYWJzKHkgPSAiIiwgeCA9ICIiLCBjb2wgPSAiYmFycyIpICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIikrCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IHdlc19wYWxldHRlKCJCb3R0bGVSb2NrZXQyIilbMV0pCgpwX2FnZV9zaW5nbGUgPC0gZ2dwbG90KGRmX3NpbmdsZWNhc2VzLCBhZXMoeCA9IGFzLm51bWVyaWMoYWdlKSwgeSA9IHBhc3RlMCgic2luZ2xlIGNhc2VzIChuID0gIiwgbl9zaW5nbGUsIikiKSkpICsKICBnZW9tX3Zpb2xpbihmaWxsID0gd2VzX3BhbGV0dGUoIkRhcmplZWxpbmcyIilbNF0pICsgCiAgZ2VvbV9ib3hwbG90KHdpZHRoPS4zLCBmaWxsID0gd2VzX3BhbGV0dGUoIkRhcmplZWxpbmcyIilbMV0pICsgCiAgdGhlbWVfYncoKSArIGdlb21fYmVlc3dhcm0oZ3JvdXBPblg9RkFMU0UsIGFscGhhID0gMC41KSArIGxpbXMoeCA9IGMoMCwyMSkpICsgCiAgbGFicyh5ID0gIiIsIHggPSAiQWdlICh5ZWFycykiKQoKcGxvdF9hZ2UgPC0gcGxvdF9ncmlkKHBfYWdlX2NvaG9ydCwgcF9hZ2VfY29udHJvbHMsIHBfYWdlX3NpbmdsZSwgYWxpZ24gPSAidiIsIG5yb3cgPSAzLCByZWxfaGVpZ2h0cyA9IGMoMi8zLCAxLzUsIDEvMykpCnBsb3RfYWdlCmBgYAoKCmBgYHtyLCBmaWcuaGVpZ2h0PSAxMCwgZmlnLndpZHRoPTE2fQpmaWd1cmUgPC0gZ2dhcnJhbmdlKHBsb3RfYWdlLCBwbG90X3NleCwgbGFiZWxzID0gYygiQSIsICJCIiksIHdpZHRocyA9IGMoMS4yNSwxKSkKZ2dzYXZlKGZpZ3VyZSwgZmlsZW5hbWUgPSAiLi9wbG90cy9kZW1vX2dyaWRfcGxvdHMucG5nIiwgZHBpID0gMzAwLCBoZWlnaHQ9Nywgd2lkdGg9MTApCmdnc2F2ZShmaWd1cmUsIGZpbGVuYW1lID0gIi4vcGxvdHMvZGVtb19ncmlkX3Bsb3RzLnN2ZyIsIGRwaSA9IDMwMCwgaGVpZ2h0PTcsIHdpZHRoPTEwKQpnZ3NhdmUoZmlndXJlLCBmaWxlbmFtZSA9ICIuL3Bsb3RzL2RlbW9fZ3JpZF9wbG90cy5wZGYiLCBkcGkgPSAzMDAsIGhlaWdodD03LCB3aWR0aD0xMCkKZmlndXJlCmBgYAoKCiMjIExhYiB2YWx1ZXMKIyMjIEMtcmVhY3RpdmUgcHJvdGVpbgoKYGBge3J9CmNycF9jb2xsYXBzZV9jb2hvcnQgPC0gY29sbGFwc2VfbGFidmFsc19jb2hvcnQoZGZfY29ob3J0X2NvbnRyb2xzLCAibWF4IiwgIkNSUCIpCmNycF9jb2xsYXBzZV9zaW5nbGUgPC0gY29sbGFwc2VfbGFidmFsc19zaW5nbGUoZGZfc2luZ2xlY2FzZXMsICJtYXgiLCAiQ1JQIikKY3JwX21pc3NpbmcgPC0gc3VtKGlzLm5hKGNycF9jb2xsYXBzZV9zaW5nbGUkQ1JQX21heCkpCgpwX2NycF9jb2hvcnQgPC0gZ2dwbG90KGNycF9jb2xsYXBzZV9jb2hvcnQsIGFlcyh5ID0gY29ob3J0X2lkLCB4ID0gQ1JQX21lZCwgY29sID0gY29ob3J0X3R5cGUpKSArIAogIGdlb21fcG9pbnQoKSArICAKICBnZW9tX2Vycm9yYmFyKGFlcyh4bWluPUNSUF9taW4sIHhtYXg9Q1JQX21heCksIHdpZHRoPS4yLCBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSguOSkpICsgbGltcyh4ID0gYygwLDYwMCkpICsgCiAgdGhlbWVfYncoKSArIGxhYnModGl0bGUgPSAiQ1JQIiwgeSA9ICJjb2hvcnQiLCB4ID0gIiIpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBjb19DUlAsIGxpbmV0eXBlID0gImRhc2hlZCIsIGNvbG9yID0gImJsYWNrIikgKyB0aGVtZShsZWdlbmQuanVzdGlmaWNhdGlvbiA9IGMoMSwgMSksIGxlZ2VuZC5wb3NpdGlvbiA9IGMoMC45OCwgMC45OCksIGxlZ2VuZC50aXRsZT1lbGVtZW50X2JsYW5rKCkpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gd2VzX3BhbGV0dGUoIlJveWFsMSIpKQoKcF9jcnBfc2luZ2xlIDwtIGdncGxvdChjcnBfY29sbGFwc2Vfc2luZ2xlLCBhZXMoeCA9IGFzLm51bWVyaWMoQ1JQX21heCksIHkgPSBjb2hvcnRfaWQpKSArCiAgZ2VvbV92aW9saW4oZmlsbCA9IHdlc19wYWxldHRlKCJEYXJqZWVsaW5nMiIpWzRdKSArIAogIGdlb21fYm94cGxvdCh3aWR0aD0uMywgZmlsbCA9ICB3ZXNfcGFsZXR0ZSgiRGFyamVlbGluZzIiKVsxXSkgKyAKICB0aGVtZV9idygpICsgZ2VvbV9iZWVzd2FybShncm91cE9uWD1GQUxTRSwgYWxwaGEgPSAwLjUpICsgbGltcyh4ID0gYygwLDYwMCkpICsgbGFicyh5ID0gIiIsIHggPSAiQ1JQIChtZy9kTCkiLCBzdWJ0aXRsZSA9IHBhc3RlMCgibWlzc2luZyBkYXRhIGZvciAiLCBjcnBfbWlzc2luZywgIiBjYXNlcyIpKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gY29fQ1JQLCBsaW5ldHlwZSA9ICJkYXNoZWQiLCBjb2xvciA9ICJibGFjayIpCgpDUlBfZ3JpZCA8LSBwbG90X2dyaWQocF9jcnBfY29ob3J0LCBwX2NycF9zaW5nbGUsIGFsaWduID0gInYiLCBucm93ID0gMiwgcmVsX2hlaWdodHMgPSBjKDIvMywgMS8zKSkKQ1JQX2dyaWQKYGBgCgojIyMgRmVycml0aW4KYGBge3J9CmZlcnJpdGluX2NvbGxhcHNlX2NvaG9ydCA8LSBjb2xsYXBzZV9sYWJ2YWxzX2NvaG9ydChkZl9jb2hvcnRfY29udHJvbHMsICJtYXgiLCAiZmVycml0IikKZmVycml0aW5fY29sbGFwc2Vfc2luZ2xlIDwtIGNvbGxhcHNlX2xhYnZhbHNfc2luZ2xlKGRmX3NpbmdsZWNhc2VzLCAibWF4IiwgImZlcnJpdCIpCmZlcnJpdGluX21pc3NpbmcgPC0gc3VtKGlzLm5hKGZlcnJpdGluX2NvbGxhcHNlX3NpbmdsZSRmZXJyaXRfbWF4KSkKCnBfZmVycml0aW5fY29ob3J0IDwtIGdncGxvdChmZXJyaXRpbl9jb2xsYXBzZV9jb2hvcnQsIGFlcyh5ID0gY29ob3J0X2lkLCB4ID0gZmVycml0X21lZCwgY29sID0gY29ob3J0X3R5cGUpKSArIAogIGdlb21fcG9pbnQoKSArICAKICBnZW9tX2Vycm9yYmFyKGFlcyh4bWluPWZlcnJpdF9taW4sIHhtYXg9ZmVycml0X21heCksIHdpZHRoPS4yLCBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSguOSkpICsgbGltcyh4ID0gYygwLDExMDAwKSkgKyAKICB0aGVtZV9idygpICsgbGFicyh0aXRsZSA9ICJGZXJyaXRpbiIsIHkgPSAiY29ob3J0IiwgeCA9ICIiKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gY29fZmVycml0aW4sIGxpbmV0eXBlID0gImRhc2hlZCIsIGNvbG9yID0gImJsYWNrIikgKyB0aGVtZShsZWdlbmQuanVzdGlmaWNhdGlvbiA9IGMoMSwgMSksIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwgbGVnZW5kLnRpdGxlPWVsZW1lbnRfYmxhbmsoKSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSB3ZXNfcGFsZXR0ZSgiUm95YWwxIikpCgpwX2ZlcnJpdGluX3NpbmdsZSA8LSBnZ3Bsb3QoZmVycml0aW5fY29sbGFwc2Vfc2luZ2xlLCBhZXMoeCA9IGFzLm51bWVyaWMoZmVycml0X21heCksIHkgPSBjb2hvcnRfaWQpKSArCiAgZ2VvbV92aW9saW4oZmlsbCA9IHdlc19wYWxldHRlKCJEYXJqZWVsaW5nMiIpWzRdKSArIAogIGdlb21fYm94cGxvdCh3aWR0aD0uMywgZmlsbCA9IHdlc19wYWxldHRlKCJEYXJqZWVsaW5nMiIpWzFdKSArIAogIHRoZW1lX2J3KCkgKyBnZW9tX2JlZXN3YXJtKGdyb3VwT25YPUZBTFNFLCBhbHBoYSA9IDAuNSkgKyBsYWJzKHkgPSAiIiwgeCA9ICJGZXJyaXRpbiAowrVnL2wpIiwgc3VidGl0bGUgPSBwYXN0ZTAoIm1pc3NpbmcgZGF0YSBmb3IgIiwgZmVycml0aW5fbWlzc2luZywgIiBjYXNlcyIpKSArIGxpbXMoeCA9IGMoMCwxMTAwMCkpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBjb19mZXJyaXRpbiwgbGluZXR5cGUgPSAiZGFzaGVkIiwgY29sb3IgPSAiYmxhY2siKSAKCmZlcnJpdGluX2dyaWQgPC0gcGxvdF9ncmlkKHBfZmVycml0aW5fY29ob3J0LCBwX2ZlcnJpdGluX3NpbmdsZSwgYWxpZ24gPSAidiIsIG5yb3cgPSAyLCByZWxfaGVpZ2h0cyA9IGMoMi8zLCAxLzMpKQpmZXJyaXRpbl9ncmlkCmBgYAoKCiMjIyBJTC02Ck5vdGU6IFRoZSBjYXNlcyBmcm9tIFBvdWxldHR5IGV0IGFsIGFyZSBhZGRlZCB0byB0aGUgc2luZ2xlIGNhc2VzIGFzIHRoZXkgcmVwb3J0IG9uIElMNiB2YWx1ZXMuIAoKYGBge3J9CklMNl9jb2xsYXBzZV9jb2hvcnQgPC0gY29sbGFwc2VfbGFidmFsc19jb2hvcnQoZGZfY29ob3J0X2NvbnRyb2xzLCAibWF4IiwgIklMNiIpCklMNl9jb2xsYXBzZV9zaW5nbGUgPC0gY29sbGFwc2VfbGFidmFsc19zaW5nbGUoZGZfc2luZ2xlY2FzZXNfaW5jbFBvdWxldHR5LCAibWF4IiwgIklMNiIpCklMNl9taXNzaW5nIDwtIHN1bShpcy5uYShJTDZfY29sbGFwc2Vfc2luZ2xlJElMNl9tYXgpKQoKcF9JTDZfY29ob3J0IDwtIGdncGxvdChJTDZfY29sbGFwc2VfY29ob3J0LCBhZXMoeSA9IGNvaG9ydF9pZCwgeCA9IElMNl9tZWQsIGNvbCA9IGNvaG9ydF90eXBlKSkgKyAKICBnZW9tX3BvaW50KCkgKyAgCiAgZ2VvbV9lcnJvcmJhcihhZXMoeG1pbj1JTDZfbWluLCB4bWF4PUlMNl9tYXgpLCB3aWR0aD0uMiwgcG9zaXRpb249cG9zaXRpb25fZG9kZ2UoLjkpKSArIGxpbXMoeCA9IGMoMCwyNTAwKSkgKyAKICB0aGVtZV9idygpICsgbGFicyh0aXRsZSA9ICJJTDYiLCB5ID0gImNvaG9ydCIsIHggPSAiIikgICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBjb19JTDYsIGxpbmV0eXBlID0gImRhc2hlZCIsIGNvbG9yID0gImJsYWNrIikgICsgdGhlbWUobGVnZW5kLmp1c3RpZmljYXRpb24gPSBjKDEsIDEpLCBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsIGxlZ2VuZC50aXRsZT1lbGVtZW50X2JsYW5rKCkpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gd2VzX3BhbGV0dGUoIlJveWFsMSIpKQoKcF9JTDZfc2luZ2xlIDwtIGdncGxvdChJTDZfY29sbGFwc2Vfc2luZ2xlLCBhZXMoeCA9IGFzLm51bWVyaWMoSUw2X21heCksIHkgPSBjb2hvcnRfaWQpKSArCiAgZ2VvbV92aW9saW4oZmlsbCA9IHdlc19wYWxldHRlKCJEYXJqZWVsaW5nMiIpWzRdKSArIAogIGdlb21fYm94cGxvdCh3aWR0aD0uMywgZmlsbCA9IHdlc19wYWxldHRlKCJEYXJqZWVsaW5nMiIpWzFdKSArIAogIHRoZW1lX2J3KCkgKyBnZW9tX2JlZXN3YXJtKGdyb3VwT25YPUZBTFNFLCBhbHBoYSA9IDAuNSkgKyBsYWJzKHkgPSAiIiwgeCA9ICJJTDYgKHBnL21sKSIsIHN1YnRpdGxlID0gcGFzdGUwKCJtaXNzaW5nIGRhdGEgZm9yICIsIElMNl9taXNzaW5nLCAiIGNhc2VzIikpICsgbGltcyh4ID0gYygwLDI1MDApKSAgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGNvX0lMNiwgbGluZXR5cGUgPSAiZGFzaGVkIiwgY29sb3IgPSAiYmxhY2siKSAKCklMNl9ncmlkIDwtIHBsb3RfZ3JpZChwX0lMNl9jb2hvcnQsIHBfSUw2X3NpbmdsZSwgYWxpZ24gPSAidiIsIG5yb3cgPSAyLCByZWxfaGVpZ2h0cyA9IGMoMi8zLCAxLzMpKQpJTDZfZ3JpZApgYGAKCgojIyMgV2hpdGUgYmxvb2QgY2VsbHMKYGBge3J9CndiY19jb2xsYXBzZV9jb2hvcnQgPC0gY29sbGFwc2VfbGFidmFsc19jb2hvcnQoZGZfY29ob3J0X2NvbnRyb2xzLCAibWF4IiwgIldCQyIpCndiY19jb2xsYXBzZV9zaW5nbGUgPC0gY29sbGFwc2VfbGFidmFsc19zaW5nbGUoZGZfc2luZ2xlY2FzZXMsICJtYXgiLCAiV0JDIikKd2JjX21pc3NpbmcgPC0gc3VtKGlzLm5hKHdiY19jb2xsYXBzZV9zaW5nbGUkV0JDX21heCkpCgpwX3diY19jb2hvcnQgPC0gZ2dwbG90KHdiY19jb2xsYXBzZV9jb2hvcnQsIGFlcyh5ID0gY29ob3J0X2lkLCB4ID0gV0JDX21lZCwgY29sID0gY29ob3J0X3R5cGUpKSArIAogIGdlb21fcG9pbnQoKSArICAKICBnZW9tX2Vycm9yYmFyKGFlcyh4bWluPVdCQ19taW4sIHhtYXg9V0JDX21heCksIHdpZHRoPS4yLCBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSguOSkpICsgbGltcyh4ID0gYygwLDUwMDAwKSkgKyAKICB0aGVtZV9idygpICsgbGFicyh0aXRsZSA9ICJXaGl0ZSBibG9vZCBjZWxscyIsIHkgPSAiIiwgeCA9ICIiKSAgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGNvX1dCQywgbGluZXR5cGUgPSAiZGFzaGVkIiwgY29sb3IgPSAiYmxhY2siKSAgKyB0aGVtZShsZWdlbmQuanVzdGlmaWNhdGlvbiA9IGMoMSwgMSksIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwgbGVnZW5kLnRpdGxlPWVsZW1lbnRfYmxhbmsoKSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSB3ZXNfcGFsZXR0ZSgiUm95YWwxIikpKyBycmVtb3ZlKCJ5LnRleHQiKSAKCnBfd2JjX3NpbmdsZSA8LSBnZ3Bsb3Qod2JjX2NvbGxhcHNlX3NpbmdsZSwgYWVzKHggPSBhcy5udW1lcmljKFdCQ19tYXgpLCB5ID0gY29ob3J0X2lkKSkgKwogIGdlb21fdmlvbGluKGZpbGwgPSB3ZXNfcGFsZXR0ZSgiRGFyamVlbGluZzIiKVs0XSkgKyAKICBnZW9tX2JveHBsb3Qod2lkdGg9LjMsIGZpbGwgPSB3ZXNfcGFsZXR0ZSgiRGFyamVlbGluZzIiKVsxXSkgKyAKICB0aGVtZV9idygpICsgZ2VvbV9iZWVzd2FybShncm91cE9uWD1GQUxTRSwgYWxwaGEgPSAwLjUpICsgbGFicyh5ID0gIiIsIHggPSAiV0JDICgvwrVMKSIsIHN1YnRpdGxlID0gcGFzdGUwKCJtaXNzaW5nIGRhdGEgZm9yICIsIHdiY19taXNzaW5nLCAiIGNhc2VzIikpICsgbGltcyh4ID0gYygwLDUwMDAwKSkgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGNvX1dCQywgbGluZXR5cGUgPSAiZGFzaGVkIiwgY29sb3IgPSAiYmxhY2siKSArIHJyZW1vdmUoInkudGV4dCIpIAoKV0JDX2dyaWQgPC0gcGxvdF9ncmlkKHBfd2JjX2NvaG9ydCwgcF93YmNfc2luZ2xlLCBhbGlnbiA9ICJ2IiwgbnJvdyA9IDIsIHJlbF9oZWlnaHRzID0gYygyLzMsIDEvMykpCldCQ19ncmlkCmBgYAoKIyMjIEx5bXBob2N5dGVzCmBgYHtyfQpseW1waG9fY29sbGFwc2VfY29ob3J0IDwtIGNvbGxhcHNlX2xhYnZhbHNfY29ob3J0KGRmX2NvaG9ydF9jb250cm9scywgIm1pbiIsICJseW1waG8iKQpseW1waG9fY29sbGFwc2Vfc2luZ2xlIDwtIGNvbGxhcHNlX2xhYnZhbHNfc2luZ2xlKGRmX3NpbmdsZWNhc2VzLCAibWluIiwgImx5bXBobyIpCmx5bXBob19taXNzaW5nIDwtIHN1bShpcy5uYShseW1waG9fY29sbGFwc2Vfc2luZ2xlJGx5bXBob19taW4pKQoKcF9seW1waG9fY29ob3J0IDwtIGdncGxvdChseW1waG9fY29sbGFwc2VfY29ob3J0LCBhZXMoeSA9IGNvaG9ydF9pZCwgeCA9IGx5bXBob19tZWQsIGNvbCA9IGNvaG9ydF90eXBlKSkgKyAKICBnZW9tX3BvaW50KCkgKyAgCiAgZ2VvbV9lcnJvcmJhcihhZXMoeG1pbj1seW1waG9fbWluLCB4bWF4PWx5bXBob19tYXgpLCB3aWR0aD0uMiwgcG9zaXRpb249cG9zaXRpb25fZG9kZ2UoLjkpKSArIAogIHRoZW1lX2J3KCkgKyBsYWJzKHRpdGxlID0gIkx5bXBob2N5dGVzIiwgeSA9ICIiLCB4ID0gIiIpICsgbGltcyh4ID0gYygwLDc1MDApKSAgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGNvX2x5bXBobywgbGluZXR5cGUgPSAiZGFzaGVkIiwgY29sb3IgPSAiYmxhY2siKSArIHRoZW1lKGxlZ2VuZC5qdXN0aWZpY2F0aW9uID0gYygxLCAxKSwgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLCBsZWdlbmQudGl0bGU9ZWxlbWVudF9ibGFuaygpKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IHdlc19wYWxldHRlKCJSb3lhbDEiKSkrCiAgcnJlbW92ZSgieS50ZXh0IikgCgpwX2x5bXBob19zaW5nbGUgPC0gZ2dwbG90KGx5bXBob19jb2xsYXBzZV9zaW5nbGUsIGFlcyh4ID0gYXMubnVtZXJpYyhseW1waG9fbWluKSwgeSA9IGNvaG9ydF9pZCkpICsKICBnZW9tX3Zpb2xpbihmaWxsID0gd2VzX3BhbGV0dGUoIkRhcmplZWxpbmcyIilbNF0pICsgCiAgZ2VvbV9ib3hwbG90KHdpZHRoPS4zLCBmaWxsID0gd2VzX3BhbGV0dGUoIkRhcmplZWxpbmcyIilbMV0pICsgCiAgbGltcyh4ID0gYygwLDc1MDApKSsKICB0aGVtZV9idygpICsgZ2VvbV9iZWVzd2FybShncm91cE9uWD1GQUxTRSwgYWxwaGEgPSAwLjUpICArIGxhYnMoeSA9ICIiLCB4ID0gIkx5bXBob2N5dGVzICgvwrVMKSIsIHN1YnRpdGxlID0gcGFzdGUwKCJtaXNzaW5nIGRhdGEgZm9yICIsIGx5bXBob19taXNzaW5nLCAiIGNhc2VzIikpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBjb19seW1waG8sIGxpbmV0eXBlID0gImRhc2hlZCIsIGNvbG9yID0gImJsYWNrIikgKyAgcnJlbW92ZSgieS50ZXh0IikgCgpseW1waG9fZ3JpZCA8LSBwbG90X2dyaWQocF9seW1waG9fY29ob3J0LCBwX2x5bXBob19zaW5nbGUsIGFsaWduID0gInYiLCBucm93ID0gMiwgcmVsX2hlaWdodHMgPSBjKDIvMywgMS8zKSkKbHltcGhvX2dyaWQKYGBgCgoKIyMjIFRyb3BvbmluCmBgYHtyfQp0cm9wb25pbl9jb2xsYXBzZV9jb2hvcnQgPC0gY29sbGFwc2VfbGFidmFsc19jb2hvcnQoZGZfY29ob3J0X2NvbnRyb2xzLCAibWF4IiwgInRyb3BvbmluIikKdHJvcG9uaW5fY29sbGFwc2Vfc2luZ2xlIDwtIGNvbGxhcHNlX2xhYnZhbHNfc2luZ2xlKGRmX3NpbmdsZWNhc2VzLCAibWF4IiwgInRyb3BvbmluIikKdHJvcG9uaW5fbWlzc2luZyA8LSBzdW0oaXMubmEodHJvcG9uaW5fY29sbGFwc2Vfc2luZ2xlJHRyb3BvbmluX21heCkpCgpwX3Ryb3BvbmluX2NvaG9ydCA8LSBnZ3Bsb3QodHJvcG9uaW5fY29sbGFwc2VfY29ob3J0LCBhZXMoeSA9IGNvaG9ydF9pZCwgeCA9IHRyb3BvbmluX21lZCwgY29sID0gY29ob3J0X3R5cGUpKSArIAogIGdlb21fcG9pbnQoKSArICAKICBnZW9tX2Vycm9yYmFyKGFlcyh4bWluPXRyb3BvbmluX21pbiwgeG1heD10cm9wb25pbl9tYXgpLCB3aWR0aD0uMiwgcG9zaXRpb249cG9zaXRpb25fZG9kZ2UoLjkpKSArIGxpbXMoeCA9IGMoMCw3MDAwKSkgKyAKICB0aGVtZV9idygpICsgbGFicyh0aXRsZSA9ICJUcm9wb25pbiIsIHkgPSAiIiwgeCA9ICIiKSAgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGNvX3Ryb3BvLCBsaW5ldHlwZSA9ICJkYXNoZWQiLCBjb2xvciA9ICJibGFjayIpICArIHRoZW1lKGxlZ2VuZC5qdXN0aWZpY2F0aW9uID0gYygxLCAxKSwgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLCBsZWdlbmQudGl0bGU9ZWxlbWVudF9ibGFuaygpKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IHdlc19wYWxldHRlKCJSb3lhbDEiKSkrIHJyZW1vdmUoInkudGV4dCIpIAoKcF90cm9wb25pbl9zaW5nbGUgPC0gZ2dwbG90KHRyb3BvbmluX2NvbGxhcHNlX3NpbmdsZSwgYWVzKHggPSBhcy5udW1lcmljKHRyb3BvbmluX21heCksIHkgPSBjb2hvcnRfaWQpKSArCiAgZ2VvbV92aW9saW4oZmlsbCA9IHdlc19wYWxldHRlKCJEYXJqZWVsaW5nMiIpWzRdKSArIAogIGdlb21fYm94cGxvdCh3aWR0aD0uMywgZmlsbCA9IHdlc19wYWxldHRlKCJEYXJqZWVsaW5nMiIpWzFdKSArIAogIHRoZW1lX2J3KCkgKyBnZW9tX2JlZXN3YXJtKGdyb3VwT25YPUZBTFNFLCBhbHBoYSA9IDAuNSkgKyBsYWJzKHkgPSAiIiwgeCA9ICJUcm9wb25pbiAobmcvTCkiLCBzdWJ0aXRsZSA9IHBhc3RlMCgibWlzc2luZyBkYXRhIGZvciAiLCB0cm9wb25pbl9taXNzaW5nLCAiIGNhc2VzIikpICsgbGltcyh4ID0gYygwLDcwMDApKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gY29fdHJvcG8sIGxpbmV0eXBlID0gImRhc2hlZCIsIGNvbG9yID0gImJsYWNrIikgKyBycmVtb3ZlKCJ5LnRleHQiKSAKCnRyb3BvbmluX2dyaWQgPC0gcGxvdF9ncmlkKHBfdHJvcG9uaW5fY29ob3J0LCBwX3Ryb3BvbmluX3NpbmdsZSwgYWxpZ24gPSAidiIsIG5yb3cgPSAyLCByZWxfaGVpZ2h0cyA9IGMoMi8zLCAxLzMpKQp0cm9wb25pbl9ncmlkCmBgYAoKCiMjIyBQbGF0ZWxldHMKCmBgYHtyfQpjb2xsYXBzZV9jb2hvcnQgPC0gY29sbGFwc2VfbGFidmFsc19jb2hvcnQoZGZfY29ob3J0X2NvbnRyb2xzLCAibWluIiwgInBsYXRlbGV0IikKY29sbGFwc2Vfc2luZ2xlIDwtIGNvbGxhcHNlX2xhYnZhbHNfc2luZ2xlKGRmX3NpbmdsZWNhc2VzLCAibWluIiwgInBsYXRlbGV0IikKbWlzc2luZyA8LSBzdW0oaXMubmEoY29sbGFwc2Vfc2luZ2xlJHBsYXRlbGV0X21pbikpCgpwX3BsYXRlbGV0X2NvaG9ydCA8LSBnZ3Bsb3QoY29sbGFwc2VfY29ob3J0LCBhZXMoeSA9IGNvaG9ydF9pZCwgeCA9IHBsYXRlbGV0X21lZC8xMDAwLCBjb2wgPSBjb2hvcnRfdHlwZSkpICsgCiAgZ2VvbV9wb2ludCgpICsgIAogIGdlb21fZXJyb3JiYXIoYWVzKHhtaW49cGxhdGVsZXRfbWluLzEwMDAsIHhtYXg9cGxhdGVsZXRfbWF4LzEwMDAsIGNvbD1jb2hvcnRfdHlwZSksIHdpZHRoPS4yLCBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSguOSkpICsgbGltcyh4ID0gYygwLDc1MCkpICsgCiAgdGhlbWVfYncoKSArIGxhYnModGl0bGUgPSAiUGxhdGVsZXRzIiwgeSA9ICIiLCB4ID0gIiIpICArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gY29fcGxhdGVsZXQvMTAwMCwgbGluZXR5cGUgPSAiZGFzaGVkIiwgY29sb3IgPSAiYmxhY2siKSAgKyB0aGVtZShsZWdlbmQuanVzdGlmaWNhdGlvbiA9IGMoMSwgMSksIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwgbGVnZW5kLnRpdGxlPWVsZW1lbnRfYmxhbmsoKSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSB3ZXNfcGFsZXR0ZSgiUm95YWwxIikpKyBycmVtb3ZlKCJ5LnRleHQiKSAKCnBfcGxhdGVsZXRfc2luZ2xlIDwtIGdncGxvdChjb2xsYXBzZV9zaW5nbGUsIGFlcyh4ID0gYXMubnVtZXJpYyhwbGF0ZWxldF9taW4pLzEwMDAsIHkgPSBjb2hvcnRfaWQpKSArCiAgZ2VvbV92aW9saW4oZmlsbCA9IHdlc19wYWxldHRlKCJEYXJqZWVsaW5nMiIpWzRdKSArIAogIGdlb21fYm94cGxvdCh3aWR0aD0uMywgZmlsbCA9IHdlc19wYWxldHRlKCJEYXJqZWVsaW5nMiIpWzFdKSArIAogIHRoZW1lX2J3KCkgKyBnZW9tX2JlZXN3YXJtKGdyb3VwT25YPUZBTFNFLCBhbHBoYSA9IDAuNSkgKyBsYWJzKHkgPSAiIiwgeCA9ICJQbGF0ZWxldHMgKHgxMDAwL8K1TCkiLCBzdWJ0aXRsZSA9IHBhc3RlMCgibWlzc2luZyBkYXRhIGZvciAiLCBtaXNzaW5nLCAiIGNhc2VzIikpICsgbGltcyh4ID0gYygwLDc1MCkpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBjb19wbGF0ZWxldCwgbGluZXR5cGUgPSAiZGFzaGVkIiwgY29sb3IgPSAiYmxhY2siKSArIHJyZW1vdmUoInkudGV4dCIpIAoKcGxhdGVsZXRfZ3JpZCA8LSBwbG90X2dyaWQocF9wbGF0ZWxldF9jb2hvcnQsIHBfcGxhdGVsZXRfc2luZ2xlLCBhbGlnbiA9ICJ2IiwgbnJvdyA9IDIsIHJlbF9oZWlnaHRzID0gYygyLzMsIDEvMykpCnBsYXRlbGV0X2dyaWQKYGBgCgoKIyMjIEQtZGltZXJzCgpgYGB7cn0KY29sbGFwc2VfY29ob3J0IDwtIGNvbGxhcHNlX2xhYnZhbHNfY29ob3J0KGRmX2NvaG9ydF9jb250cm9scywgIm1heCIsICJEZGltIikKY29sbGFwc2Vfc2luZ2xlIDwtIGNvbGxhcHNlX2xhYnZhbHNfc2luZ2xlKGRmX3NpbmdsZWNhc2VzLCAibWF4IiwgIkRkaW0iKQptaXNzaW5nIDwtIHN1bShpcy5uYShjb2xsYXBzZV9zaW5nbGUkRGRpbV9tYXgpKQoKcF9EZGltX2NvaG9ydCA8LSBnZ3Bsb3QoY29sbGFwc2VfY29ob3J0LCBhZXMoeSA9IGNvaG9ydF9pZCwgeCA9IERkaW1fbWVkLCBjb2wgPSBjb2hvcnRfdHlwZSkpICsgCiAgZ2VvbV9wb2ludCgpICsgIAogIGdlb21fZXJyb3JiYXIoYWVzKHhtaW49RGRpbV9taW4sIHhtYXg9RGRpbV9tYXgsIGNvbD1jb2hvcnRfdHlwZSksIHdpZHRoPS4yLCBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSguOSkpICsgbGltcyh4ID0gYygwLDExMDAwKSkgKyAKICB0aGVtZV9idygpICsgbGFicyh0aXRsZSA9ICJELWRpbWVycyIsIHkgPSAiIiwgeCA9ICIiKSAgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGNvX0RkaW0sIGxpbmV0eXBlID0gImRhc2hlZCIsIGNvbG9yID0gImJsYWNrIikgICsgdGhlbWUobGVnZW5kLmp1c3RpZmljYXRpb24gPSBjKDEsIDEpLCBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsIGxlZ2VuZC50aXRsZT1lbGVtZW50X2JsYW5rKCkpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gd2VzX3BhbGV0dGUoIlJveWFsMSIpKSArIHJyZW1vdmUoInkudGV4dCIpIAoKcF9EZGltX3NpbmdsZSA8LSBnZ3Bsb3QoY29sbGFwc2Vfc2luZ2xlLCBhZXMoeCA9IGFzLm51bWVyaWMoRGRpbV9tYXgpLCB5ID0gY29ob3J0X2lkKSkgKwogIGdlb21fdmlvbGluKGZpbGwgPSB3ZXNfcGFsZXR0ZSgiRGFyamVlbGluZzIiKVs0XSkgKyAKICBnZW9tX2JveHBsb3Qod2lkdGg9LjMsIGZpbGwgPSB3ZXNfcGFsZXR0ZSgiRGFyamVlbGluZzIiKVsxXSkgKyAKICB0aGVtZV9idygpICsgZ2VvbV9iZWVzd2FybShncm91cE9uWD1GQUxTRSwgYWxwaGEgPSAwLjUpICsgbGFicyh5ID0gIiIsIHggPSAiRC1kaW1lcnMgKG5nL21sKSIsIHN1YnRpdGxlID0gcGFzdGUwKCJtaXNzaW5nIGRhdGEgZm9yICIsIG1pc3NpbmcsICIgY2FzZXMiKSkgKyBsaW1zKHggPSBjKDAsMTEwMDApKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gY29fRGRpbSwgbGluZXR5cGUgPSAiZGFzaGVkIiwgY29sb3IgPSAiYmxhY2siKSArIHJyZW1vdmUoInkudGV4dCIpIAoKRGRpbV9ncmlkIDwtIHBsb3RfZ3JpZChwX0RkaW1fY29ob3J0LCBwX0RkaW1fc2luZ2xlLCBhbGlnbiA9ICJ2IiwgbnJvdyA9IDIsIHJlbF9oZWlnaHRzID0gYygyLzMsIDEvMykpCkRkaW1fZ3JpZApgYGAKCgojIyMgU29kaXVtCgpgYGB7cn0KY29sbGFwc2VfY29ob3J0IDwtIGNvbGxhcHNlX2xhYnZhbHNfY29ob3J0KGRmX2NvaG9ydF9jb250cm9scywgIm1pbiIsICJzb2RpdW0iKQpjb2xsYXBzZV9zaW5nbGUgPC0gY29sbGFwc2VfbGFidmFsc19zaW5nbGUoZGZfc2luZ2xlY2FzZXMsICJtaW4iLCAic29kaXVtIikKbWlzc2luZyA8LSBzdW0oaXMubmEoY29sbGFwc2Vfc2luZ2xlJHNvZGl1bV9taW4pKQoKcF9zb2RpdW1fY29ob3J0IDwtIGdncGxvdChjb2xsYXBzZV9jb2hvcnQsIGFlcyh5ID0gY29ob3J0X2lkLCB4ID0gc29kaXVtX21lZCwgY29sID0gY29ob3J0X3R5cGUpKSArIAogIGdlb21fcG9pbnQoKSArICAKICBnZW9tX2Vycm9yYmFyKGFlcyh4bWluPXNvZGl1bV9taW4sIHhtYXg9c29kaXVtX21heCwgY29sPWNvaG9ydF90eXBlKSwgd2lkdGg9LjIsIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKC45KSkgKyBsaW1zKHggPSBjKDEwMCwxNTApKSArIAogIHRoZW1lX2J3KCkgKyBsYWJzKHRpdGxlID0gIlNvZGl1bSIsIHkgPSAiIiwgeCA9ICIiKSAgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGNvX3NvZGl1bSwgbGluZXR5cGUgPSAiZGFzaGVkIiwgY29sb3IgPSAiYmxhY2siKSAgKyB0aGVtZShsZWdlbmQuanVzdGlmaWNhdGlvbiA9IGMoMSwgMSksIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwgbGVnZW5kLnRpdGxlPWVsZW1lbnRfYmxhbmsoKSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSB3ZXNfcGFsZXR0ZSgiUm95YWwxIikpKyBycmVtb3ZlKCJ5LnRleHQiKSAKCnBfc29kaXVtX3NpbmdsZSA8LSBnZ3Bsb3QoY29sbGFwc2Vfc2luZ2xlLCBhZXMoeCA9IGFzLm51bWVyaWMoc29kaXVtX21pbiksIHkgPSBjb2hvcnRfaWQpKSArCiAgZ2VvbV92aW9saW4oZmlsbCA9IHdlc19wYWxldHRlKCJEYXJqZWVsaW5nMiIpWzRdKSArIAogIGdlb21fYm94cGxvdCh3aWR0aD0uMywgZmlsbCA9IHdlc19wYWxldHRlKCJEYXJqZWVsaW5nMiIpWzFdKSArIAogIHRoZW1lX2J3KCkgKyBnZW9tX2JlZXN3YXJtKGdyb3VwT25YPUZBTFNFLCBhbHBoYSA9IDAuNSkgKyBsYWJzKHkgPSAiIiwgY29sID0gIiIsIHggPSAiU29kaXVtIChtbW9sL0wpIiwgc3VidGl0bGUgPSBwYXN0ZTAoIm1pc3NpbmcgZGF0YSBmb3IgIiwgbWlzc2luZywgIiBjYXNlcyIpKSArIGxpbXMoeCA9IGMoMTAwLDE1MCkpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBjb19zb2RpdW0sIGxpbmV0eXBlID0gImRhc2hlZCIsIGNvbG9yID0gImJsYWNrIikgKyBycmVtb3ZlKCJ5LnRleHQiKSAKCnNvZGl1bV9ncmlkIDwtIHBsb3RfZ3JpZChwX3NvZGl1bV9jb2hvcnQsIHBfc29kaXVtX3NpbmdsZSwgYWxpZ24gPSAidiIsIG5yb3cgPSAyLCByZWxfaGVpZ2h0cyA9IGMoMi8zLCAxLzMpKQpzb2RpdW1fZ3JpZApgYGAKCgojIyMgR3JpZCBwbG90cwpFeGFtcGxlOgogIAogIERhc2hlZCBsaW5lcyBlcXVhbHMgcmVmZXJlbmNlIHZhbHVlIGN1dC1vZmYuCgpgYGB7ciwgZmlnLmhlaWdodD0gMTYsIGZpZy53aWR0aD0xMn0KZmlndXJlIDwtIGdnYXJyYW5nZShDUlBfZ3JpZCwgV0JDX2dyaWQsIHNvZGl1bV9ncmlkLCBmZXJyaXRpbl9ncmlkLCBseW1waG9fZ3JpZCwgRGRpbV9ncmlkLCBJTDZfZ3JpZCwgcGxhdGVsZXRfZ3JpZCwgdHJvcG9uaW5fZ3JpZCwgbGFiZWxzID0gYygiQSIsICJCIiwgIkMiLCAiRCIsICJFIiwgIkciLCAiRyIsICJIIiwgIkkiKSwgd2lkdGhzID0gYygxLjI1LDEsMSkpCmdnc2F2ZShmaWd1cmUsIGZpbGVuYW1lID0gIi4vcGxvdHMvbGFiX2dyaWRfcGxvdHMucG5nIiwgZHBpID0gMzAwLCBoZWlnaHQ9MTYsIHdpZHRoPTEyKQpnZ3NhdmUoZmlndXJlLCBmaWxlbmFtZSA9ICIuL3Bsb3RzL2xhYl9ncmlkX3Bsb3RzLnN2ZyIsIGRwaSA9IDMwMCwgaGVpZ2h0PTEyLCB3aWR0aD0xNikKZ2dzYXZlKGZpZ3VyZSwgZmlsZW5hbWUgPSAiLi9wbG90cy9sYWJfZ3JpZF9wbG90cy5wZGYiLCBkcGkgPSAzMDAsIGhlaWdodD0xMiwgd2lkdGg9MTYpCmZpZ3VyZQpgYGAKCiMgU2Vzc2lvbkluZm8KYGBge3J9CnNlc3Npb25JbmZvKCkKYGBg